JavaScript异步编程的Promise模式
参考:
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模式的更多相关文章
- JavaScript异步编程的Promise模式(转)
异步模式在web编程中变得越来越重要,对于web主流语言Javascript来说,这种模式实现起来不是很利索,为此,许多Javascript库(比如 jQuery和Dojo)添加了一种称为promis ...
- javascript异步编程,promise概念
javascript 异步编程 概述 采用单线程模式工作的原因: 避免多线dom操作同步问题,javascript的执行环境中负责执行代码的线程只有一个 内容概要 同步模式和异步模式 事件循环和消息队 ...
- Javascript异步编程之三Promise: 像堆积木一样组织你的异步流程
这篇有点长,不过干货挺多,既分析promise的原理,也包含一些最佳实践,亮点在最后:) 还记得上一节讲回调函数的时候,第一件事就提到了异步函数不能用return返回值,其原因就是在return语句执 ...
- JavaScript异步编程的主要解决方案—对不起,我和你不在同一个频率上
众所周知(这也忒夸张了吧?),Javascript通过事件驱动机制,在单线程模型下,以异步的形式来实现非阻塞的IO操作.这种模式使得JavaScript在处理事务时非常高效,但这带来了很多问题,比如异 ...
- javascript异步编程的前世今生,从onclick到await/async
javascript与异步编程 为了避免资源管理等复杂性的问题, javascript被设计为单线程的语言,即使有了html5 worker,也不能直接访问dom. javascript 设计之初是为 ...
- Promises与Javascript异步编程
Promises与Javascript异步编程 转载:http://www.zawaliang.com/2013/08/399.html 在如今都追求用户体验的时代,Ajax应用真的是无所不在.加上这 ...
- 5分种让你了解javascript异步编程的前世今生,从onclick到await/async
javascript与异步编程 为了避免资源管理等复杂性的问题,javascript被设计为单线程的语言,即使有了html5 worker,也不能直接访问dom. javascript 设计之初是 ...
- 转: Promises与Javascript异步编程
在如今都追求用户体验的时代,Ajax应用真的是无所不在.加上这些年浏览器技术.HTML5以及CSS3等的发展,越来越多的富Web应用出现:在给与我们良好体验的同时,Web开发人员在背后需要处理越来越多 ...
- JavaScript异步编程
前言 如果你有志于成为一个优秀的前端工程师,或是想要深入学习JavaScript,异步编程是必不可少的一个知识点,这也是区分初级,中级或高级前端的依据之一.如果你对异步编程没有太清晰的概念,那么我建议 ...
随机推荐
- FortiGate 服务License注册步骤
1. 产品服务license文档 购买服务后,用户会收到一份PDF文档<Service Registration Document>,内有如下内容: 2. 登陆 https://suppo ...
- django filter or 多条件查询
功能:django中实现多条件查询 或关系: from django.db.models import Q return qs.filter(Q(notice_to_group__contains=' ...
- 10.Redis分布式集群
10.Redis分布式集群10.1 数据分布10.1.1 数据分布理论10.1.2 Redis数据分区10.1.3 集群功能限制10.2 搭建集群10.2.1 准备节点10.2.2 节点握手10.2. ...
- 利用正则表达式实现python强口令检测
""" Chapter 7 模式匹配和正则表达式 1 用import re 导入正则表达式模块 2 用re.compile()函数创建一个Regex对象(记得使用原始字符 ...
- FTP做作业用到的知识点:
FTP做作业用到的知识点: 一: os.path 模块下常用的用法 os.path.abspath(file) #返回的是.py文件的绝对路径(完整路径) os.path.dirname(file) ...
- mysql触发器trigger 实例详解
mysql触发器trigger 实例详解 (转自 https://www.cnblogs.com/phpper/p/7587031.html) MySQL好像从5.0.2版本就开始支持触发器的功能 ...
- Maven学习 七 Maven项目创建(2)war项目
一.web项目的目录结构 如果手动创建一个java web项目,其基本的目录结构包括:METE-INF,WEB-INF,以及WEB-INF下必须包含一个web.xml文件 二.使用Maven创建wa ...
- day31并发
以后你为之奋斗的两点: 提高cpu的利用率 提高用户的体验 1.纯概念/纯方法 操作系统的发展历程 #主要的人机矛盾是什么:CPU的使用率 #输入\输出数据和CPU计算没有关系 #操作系统是怎么进化 ...
- Python从入门到精通之Fifth!
字典 类名:dict 字典是无序的. 字典的创建 info = {"k1":{1:"abc",[1,2,3]},"k2":True} ...
- MFC改变坐标系
1.在MainFrm中的PreCreateWindow中设置默认窗口大小 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !C ...