JavaScript中使Promise模式进行异步编程

Promises

其中的一种模式就是promise,它代表了一种潜在地、长时间运行但不必返回完成操作的结果。与阻塞并长时间等待运行计算完成不同,这种模式返回一个代表承诺(promised)结果的对象。

例如,需要创建一个请求到第三方系统,而它的网络延迟是不确定的。应用程序可以被释放出来做其他事情,直到这个请求返回值需要使用到,而不是在等待并阻塞住整个程序。Pormise实现了一种方法,即为状态的变化注册相应的回调函数,通常命名为then方法。

var results = searchTwitter(term).then(filterResults);
displayResults(results);

在任何时刻,promise只可能处于三种状态之一:unfulfilled(未完成), resolved(已解决) or rejected(拒绝)。

为了说明这些概念是如何工作的,我们可以了解下CommonJS Promise/A标准,这个标准在流行的库中已经有了许多衍生工具。在promise对象中的then方法为resolved以及rejected状态添加了处理程序。then函数会返回另外一个promise对象以便形成promise管道,使开发人员能够将异步操作串联起来,这样第一个操作的结果就可以作为参数传入到第二个中了。

then(resolvedHandler, rejectedHandler);

函数resolvedHandler回调函数会在promise对象进入完成状态时调用,并传递计算(computation)出来的结果。而rejectedHandler函数会在promise对象进入拒绝状态时被调用。

可以用promise的伪代码来重现上面的示例,主要包含创建一个Ajax请求用于搜索Twitter、用数据填充屏幕以及处理错误。为了更好的理解实现方法,我们尝试着从零开始构建一个promise模式的框架。我们以一个例子开始,即如果我们从头开始设计一个仅包含基础功能的promise库应该有什么,首先,我们需要一些对象格式来保存promise。

var Promise = function () {/* initialize promise */
};

接下来,我们需要实现then方法,允许我们根据promise的状态变化将操作串联在一起。这个方法包含两个函数参数,用于处理promise被解决以及promise被拒绝的情况。

Promise.prototype.then = function (onResolved, onRejected) {/* invoke handlers based upon state transition */
};

我们也需要一对方法来处理未完成和已解决或者未完成和已拒绝之间的状态转换。

Promise.prototype.resolve = function (value) {/* move from unfulfilled to resolved */
};Promise.prototype.reject = function (error) {/* move from unfulfilled to rejected */
};

对于一个promise对于应该是什么样,现在我们已经搭建的差不多了。我们可以继续上面的示例,获取包含IE10标签的tweets。首先,我们通过使用XMLHttpRequest2创建一个方法来发送一个Ajax Get请求到一个给定的URL,并且将它封装成一个promise。接下来,我们将特别为Twitter创建一个方法,用来调用含有给定搜索条件的Ajax封装方法。最后,我们会调用我们的搜索函数并在无序列表中展示结果。

function searchTwitter(term) {var url, xhr, results, promise;url = 'http://search.twitter.com/search.json?rpp=100&q=' + term;promise = new Promise();xhr = new XMLHttpRequest();xhr.open('GET', url, true);xhr.onload = function (e) {if (this.status === 200) {results = JSON.parse(this.responseText);promise.resolve(results);}};xhr.onerror = function (e) {promise.reject(e);};xhr.send();return promise;}function loadTweets() {var container = document.getElementById('container');searchTwitter('#IE10').then(function (data) {data.results.forEach(function (tweet) {var el = document.createElement('li');el.innerText = tweet.text;container.appendChild(el);});}, handleError);
}

到目前为止,我们可以把promise模式应用于单个Ajax请求,那么接下来讨论另一种场景——我们想要发送超过一个Ajax请求并协调它们的结果。为了处理这种场景,我们会在我们的Promise对象中创造一个when方法,用来储存被调用的promise对象。一旦promise从unfulfilled转变成resolved或者rejected,then方法里对应的处理函数就会被调用。有个场景至关重要,即when方法需要等待所有操作都完成才能继续。

Promise.when = function () {/* handle promises arguments and queue each */
};

现在我们可以同时存储多个promise,以在Twitter上搜索IE10和IE9两个标签的内容为例。

var container, promise1, promise2;container = document.getElementById('container');promise1 = searchTwitter('#IE10');
promise2 = searchTwitter('#IE9');Promise.when(promise1, promise2).then(function (data1, data2) {/* Reshuffle due to date */var totalResults = concatResults(data1.results, data2.results);totalResults.forEach(function (tweet) {var el = document.createElement('li');el.innerText = tweet.text;container.appendChild(el);});
}, handleError);

要重点记住的是,在这些例子中的代码除了普通JavaScript代码,并没有其它特别的。Web开发人员必定会创造他们自己的类Promise库;但为了方便和一致性,你可以利用在一般JavaScript库中公开的promise模式。

 

原文:

https://github.com/pingan1927/translate/blob/master/Asynchronous%20Programming%20in%20JavaScript%20with%20%E2%80%9CPromises%E2%80%9D.md

JQuery AJAX deferred :

 http://api.jquery.com/category/deferred-object/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Visual Studio 2022 Preview 1 和.NET 6 Preview 5 正式发布

具有里程碑意义的Visual Studio 2022 Preview 1正式发布,重点是64位,而没有增加新功能,并且同时也发布了.NET 6 Preview 5。https://devblogs.microsoft.com/visualstudio/visual-studio-2022-preview-1-now-available/https://devblogs.micr…

每日一笑 | 你知道你爸妈当年是怎么在一起的吗?

全世界只有3.14 % 的人关注了数据与算法之美(图片来源于网络,侵权删)

linux ll 转数组,List、Set、数组之间的转换

★数组转Collection使用Apache Jakarta Commons Collections:importorg.apache.commons.collections.CollectionUtils;String[] strArray {"aaa","bbb","ccc"};List strList newArrayList();Set strSet newHashSet();CollectionUtil…

c3po 问题解决

参数及问题解决http://www.blogjava.net/ashutc/archive/2011/03/16/346365.html 转载于:https://my.oschina.net/taomac/blog/118070

每日一笑 | 你知道程序媛最“大”的烦恼是什么吗?

全世界只有3.14 % 的人关注了数据与算法之美(图片来源于网络,侵权删)

什么?他居然想在DLL中放毒!

dotnet/runtime有一个issue[1]讨论了如何使用ModuleInitializer投放恶意代码,但是微软的开发经理表示不背这个锅! 什么是ModuleInitializer?ModuleInitializerAttribute[2]是在.NET5.0中新增加的API。它的作用是应用于编译中的任意数量的静态…

c语言复数的运算实验报告,C语言复数的运算(实验报告).doc

实验报告题目:复数的四则运算班级: 13信管 姓名:白浩然 学号:201340403034 完成日期:2014.05.21一、需求分析1.本演示程序中复数由两个相互之间存在次序关系的实数构成。2.演示程序以用户和计算…

为什么说人工智能是一个大谎言

全世界只有3.14 % 的人关注了数据与算法之美人工智能是一个很大的谎言。或者往轻了说,它是一个混淆概念。往重了说,是用来欺骗大众的流行语,并且流行度非常高。其实真正的内涵是“机器学习”。所以,真正强大的,每个人都…

c语言字符串倒置,单词倒置,用C++实现,将一句话里的单词进行倒置的方法详解

用C语言实现,将一句话中的单词进行倒置(单词之间倒转,单词本身不倒置),标点符号不导致。比如一句话“I come from tianjin. “,倒置后变成“tianjin. from come I ”。C常见的库函数有:复制代码 代码如下:int strstr(…

NET问答: ThreadStatic 和 ThreadLocalT 哪一个更好 ?

咨询区 user2341923&#xff1a;[ThreadStatic] 被设计成特性&#xff0c; ThreadLocal<T> 被设计成泛型&#xff0c;为什么会有这两种设计方案呢 &#xff1f;谁能告诉我他们的优缺点各是什么&#xff1f;是不是泛型的方式更好一点&#xff1f;回答区 Sanjeev&#xff1…

指针变量的定义与引用

2019独角兽企业重金招聘Python工程师标准>>> void main() { int a 5,b3; int *p; p &a; b*P5; printf("%d\n", b); *p 4; printf("%d,%d\n",a,*p); } 输出结果&#xff1a;10 4 4 之前在学校的时候就没怎么搞懂&#xff0c; 现在…

Vim的配置

2019独角兽企业重金招聘Python工程师标准>>> set nocompatible source $VIMRUNTIME/vimrc_example.vim source $VIMRUNTIME/mswin.vim behave mswin set guifontCourier_New:h12cANSI colorscheme torte set nobackup set ts4 set lines33 columns100 set diffexprM…

WPF 命中测试HitTest

获取不规则图片的点击事件&#xff0c;如果一个Canvas中&#xff0c;有很多图形&#xff0c;比如下图&#xff1a;矩形&#xff0c;菱形等。如果每个图形都加一个点击事件&#xff0c;想要一个通用的方法&#xff0c;获取鼠标点击在了哪个图形上&#xff0c;这里可以使用Visual…

不足百元的乐高式积木,玩转数理机械原理

▲数据汪特别推荐点击上图进入玩酷屋作为一名资深积木达人&#xff0c;小木我可是大大小小的积木阅览无数&#xff0c;当然乐高也不会放过&#xff0c;虽然“钱包君”已经是路人了。&#xff08;每月的工资用来买乐高~&#xff09;之前给大家推荐了一款STEM积木&#xff0c;小小…

WPF 密码框水印与明文切换

WPF开发者QQ群&#xff1a; 340500857 欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 效果预览&#xff08;更多效果请下载源码体验&#xff09;&#xff1a;一、PasswordWithPlainText.xaml 代码如下<UserControl x:Class"WpfPasswrod.CustomControls.PasswordWith…

Linux配置sudo

检查是否已经安装sudo [rootlocalhost ~]# ls -l whereis sudo---s--x--x. 2 root root 186800 Sep 1 2010 /usr/bin/sudo-rw-r--r--. 2 root root 11296 Sep 1 2010 /usr/share/man/man8/sudo.8.gz若没安装,自行下载rpm或者源码进行安装增加配置 允许rhel 不输入密码就 s…

麻省理工学院迷你猎豹机器人,四条腿都能后空翻了,又是黑科技啊~

全世界只有3.14 % 的人关注了数据与算法之美麻省理工学院公布了一款迷你猎豹机器人&#xff0c;是第一个做后空翻的四足机器人。只有20磅的四肢四足动物可弯曲并摆动腿部&#xff0c;使其能够向右或向上行走。机器人也可以在不平坦的地形上小跑&#xff0c;大约是普通人行走速度…

c语言宏高级用法,C语言宏高级用法 [总结]

1、前言今天看代码时候&#xff0c;遇到一些宏&#xff0c;之前没有见过&#xff0c;感觉挺新鲜。如是上网google一下&#xff0c;顺便总结一下&#xff0c;方便以后学习和运用。C语言程序中广泛的使用宏定义&#xff0c;采用关键字define进行定义&#xff0c;宏只是一种简单的…

Win 11 真的要来了!微软宣布 Win10 将于 2025 年终止支持!

微软今日正式更新支持页面&#xff0c;Windows 10 家庭版和专业版的支持将于 2025 年 10 月 14 日结束。值得注意的是&#xff0c;这是微软首次描述对 Windows 10 的支持结束&#xff0c;在此之前&#xff0c;微软仅记录了特定的 Windows 10 正式版本&#xff08;如最新的 Wind…

每日一笑 | 为什么椅子总是最乱的?

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;