参考:

http://www.infoq.com/cn/news/2011/09/js-promise

http://www.cnblogs.com/rubylouvre/p/3495286.html

https://segmentfault.com/a/1190000000684654

目的:为了降低异步编程的复杂性

promise模式在任何时刻都处于以下三种状态之一:未完成(unfulfilled)、已完成(resolved)和拒绝(rejected)

 //构建promise模式的框架
var Promise = function(){
// initialize promise
}
//定义then方法——接受两个参数用于处理完成和拒绝状态
Promise.prototype.then = function(onResolved, onRejected){
//invoke handlers based upon state transition
}
//两个方法来执行从未完成到已完成和从未完成到拒绝的状态转变
Promise.prototype.resolve = function(value){
//未完成----->已完成
}
Promise.prototype.reject = function(error){
//未完成------>拒绝
}

现在搭建了一个promise的架子,我们可以继续上面的示例,假设只获取IE10的内容。创建一个方法来发送Ajax请求并将其封装在promise中。这个promise对象分别在xhr.onload和xhr.onerror中指定了完成和拒绝状态的转变过程,请注意searchTwitter函数返回的正是promise对象。然后,在loadTweets中,使用then方法设置完成和拒绝状态对应的回调函数。

即then接收两个参数,成功则调用第一个,否则调用第二个

    function search(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 = doucment.getElementById('container');
seach("#IE10").then(function(data){
data.results.forEach(function(tweet){
var el = document.createElement('li');
el.innerText = tweet.text;
container.appendChild(el);
}); },handleError);
}

到目前为止,我们可以把promise模式应用于单个Ajax请求,似乎还体现不出promise的优势来。下面来看看多个Ajax请求的并发协作。此时,我们需要另一个方法when来存储准备调用的promise对象。一旦某个promise从未完成状态转化为完成或者拒绝状态,then方法里对应的处理函数就会被调用。when方法在需要等待所有操作都完成的时候至关重要。

 Promise.when = function(){
//handle promises arguments and queue each
}
var container, promise1, promise2;
container = document.getElementById('container');
promise1 = search('#IE10');
promise2 = search('#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异步编程的Promise模式的更多相关文章

  1. JavaScript异步编程的Promise模式(转)

    异步模式在web编程中变得越来越重要,对于web主流语言Javascript来说,这种模式实现起来不是很利索,为此,许多Javascript库(比如 jQuery和Dojo)添加了一种称为promis ...

  2. javascript异步编程,promise概念

    javascript 异步编程 概述 采用单线程模式工作的原因: 避免多线dom操作同步问题,javascript的执行环境中负责执行代码的线程只有一个 内容概要 同步模式和异步模式 事件循环和消息队 ...

  3. Javascript异步编程之三Promise: 像堆积木一样组织你的异步流程

    这篇有点长,不过干货挺多,既分析promise的原理,也包含一些最佳实践,亮点在最后:) 还记得上一节讲回调函数的时候,第一件事就提到了异步函数不能用return返回值,其原因就是在return语句执 ...

  4. JavaScript异步编程的主要解决方案—对不起,我和你不在同一个频率上

    众所周知(这也忒夸张了吧?),Javascript通过事件驱动机制,在单线程模型下,以异步的形式来实现非阻塞的IO操作.这种模式使得JavaScript在处理事务时非常高效,但这带来了很多问题,比如异 ...

  5. javascript异步编程的前世今生,从onclick到await/async

    javascript与异步编程 为了避免资源管理等复杂性的问题, javascript被设计为单线程的语言,即使有了html5 worker,也不能直接访问dom. javascript 设计之初是为 ...

  6. Promises与Javascript异步编程

    Promises与Javascript异步编程 转载:http://www.zawaliang.com/2013/08/399.html 在如今都追求用户体验的时代,Ajax应用真的是无所不在.加上这 ...

  7. 5分种让你了解javascript异步编程的前世今生,从onclick到await/async

      javascript与异步编程 为了避免资源管理等复杂性的问题,javascript被设计为单线程的语言,即使有了html5 worker,也不能直接访问dom. javascript 设计之初是 ...

  8. 转: Promises与Javascript异步编程

    在如今都追求用户体验的时代,Ajax应用真的是无所不在.加上这些年浏览器技术.HTML5以及CSS3等的发展,越来越多的富Web应用出现:在给与我们良好体验的同时,Web开发人员在背后需要处理越来越多 ...

  9. JavaScript异步编程

    前言 如果你有志于成为一个优秀的前端工程师,或是想要深入学习JavaScript,异步编程是必不可少的一个知识点,这也是区分初级,中级或高级前端的依据之一.如果你对异步编程没有太清晰的概念,那么我建议 ...

随机推荐

  1. php 通过扫描二维码关注公众号

    class Wxfollow {     protected $appid = 'wxf1d959b99f33b156';     protected $secret = '248f3a5606045 ...

  2. hystrix参数详解

    hystrix.command.default和hystrix.threadpool.default中的default为默认CommandKey Execution相关的属性的配置: hystrix. ...

  3. 用7ch中断例程完成jmp near ptr s指令的功能,用bx向中断例程传送转移位移。

    应用举例:在屏幕的第12行,显示data段中以0结尾的字符串. assume cs:code data segment db data ends code segment start: mov ax, ...

  4. 缓存cache介绍

    1.  为何要用缓存.缓存的目的是为了什么?(https://my.oschina.net/u/3378039/blog/2986697) 一个程序的瓶颈在于数据库,内存的速度远远大于硬盘的速度,当我 ...

  5. Java API使用

    汉化版Java API使用 首次打开出现的问题 在首次打开API时,可能你会遇见这样的问题. 经过查阅,发现是因为文档的权限问题,文档未解锁造成的.这时候只需要给给它权限就可以. 首先关闭程序,单击右 ...

  6. Linux 学习笔记 4:Shell 编程

    1.简单过滤器 a. pr [OPTION] [FILE] 功能:改变文件打印格式 选项 功能 -l n 设定页面长度为n行 -w n 设定页面总宽度为n个字符(不够会被砍掉) -h str 设定页眉 ...

  7. makefile入门-初步了解

    自己开始学习makefile是由于VScode配置工程文件,看别人的配置不是很懂,于是决定入门学习下makefile. 先来说说makefile是做什么用的:makefile可以实现工程的自动化编译, ...

  8. mysql的初次使用操作

    一.mysql 登录 mysql 参数 mysql -uroot -p123 -P3306 -h127.0.0.1 127.0.0.1本地回环地址 二.mysql退出 mysql >exit; ...

  9. logstash 修改配置不重启的方法

    1.修改好yml配置 2.进入logstash 容器内,或服务器上 3.ps -ef | grep logstash 拿到进程号 4.kill -1 <pid> 5.logstash 会重 ...

  10. HttpWebRequest 自定义header,Post发送请求,请求形式是json,坑爹的代码

    public static string PostMoths(string url, LoginDTO obj_model, Dictionary<string, string> dic ...