参考:

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. 跨DB Server创建View

    exec sp_configure 'show advanced options',1reconfigureexec sp_configure 'Ad Hoc Distributed Queries' ...

  2. linklist和arraylist区别

    ArrayList更适合读取数据,linkedList更多的时候添加或删除数据.

  3. MySQL实现阶段累加的sql写法 ,eq:统计余额

    最近项目碰到一个新的需求,统计每日充值/消费之后的余额.对于这种需求,其实也很简单,只需要在每次充值/消费后,计算下余额,然后保存下来就可以了.但是对于这种需求,一条sql就能搞定,都不需要做冗余字段 ...

  4. vuex状态管理

    msvue组件间通信时,若需要改变多组件间共用状态的值.通过简单的组件间传值就会遇到问题.如:子组件只能接收但改变不了父组件的值.由此,vuex的出现就是用作各组件间的状态管理. 简单实例:vuex的 ...

  5. 如何打开用eclipse没有.project文件的Java工程

    大概分为以下7个步骤,具体如下: 1.在你的eclipse下新建一个与你想要打开的源代码项目同名的一个项目(我这举例叫myweb). 2.在电脑磁盘中找到刚刚新建的项目,把它生成的.project文件 ...

  6. Django ORM 常用字段和参数

    Django ORM 常用字段和参数 一:常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. I ...

  7. laravel-重定向携带自定义消息

    在控制器写: return redirect(route('member_create'))->with('success', '操作成功'); //指定到路由名member_create // ...

  8. java中函数的参数传递

    转载  https://www.cnblogs.com/lixiaolun/p/4311863.html 转载https://www.cnblogs.com/wutianqi/p/8723582.ht ...

  9. js 选择指定区域

    /根据id 选择特定区域function SelectRange(id) { var div = document.getElementById(id); var controlRange; if ( ...

  10. sha1withRSA算法

    RAS_USE_PRIVATE_ENCRYPT(3021300906052b0e03021a05000414 + SHA1(DATA))