Promise - archering/basic GitHub Wiki
JS promise
一个 Promise 对象代表一个目前还不可用,但是在未来的某个时间点可以被解析的值。它允许你以一种同步的方式编写异步代码.
Promises 不是一种解决具体问题的算法,而是一种更好的代码组织模式.
Pyramid of Doom,以前处理异步问题是这样做的:回调内部再嵌套回调
比如,异步的去读取一个文件,读出文件里面的图片URL 地址,根据地址下载图片,并显示
// 回调金字塔 asyncOperation(function(fileURL){ // 获取图片url anotherAsync(function(imgURL){ // 处理返回的raw data 显示图片 yetAnotherAsync(function(){ // 完成 }); }); });
引入 Promises 之后的代码
promiseSomething() .then(function(fileURL){ // 获取图片url return anotherAsync();//返回一个promise }) .then(function(imgURL){ return yetAnotherAsync();//返回promise }) .then(function(){ // // 处理返回的raw data 显示 图片 完成 });
Promises 将嵌套的 callback,改造成一系列的.then的连缀调用,去除了层层缩进的糟糕代码风格。
var promise = new Promise(function(resolve, reject) { // executor (the producing code, "singer") });
The function passed to new Promise is called executor. When the promise is created, it’s called automatically.
Promises/A 规范
promise 有三种状态:pending,Resolved(已完成,又称 Fulfilled) 和rejected promise 的状态只能由pending转换成fulfilled ,或者unfulfilled转换成rejected。 promise 的状态转换只发生一次,一旦状态改变,就不会再变
Promise 也有一些缺点。首先,无法取消 Promise,一旦新建它就会立即执行,无法中途取消。 其次,如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。 第三,当处于 Pending 状态时,无法得知目前进展到哪一个阶
promise 有一个 then 方法,then 方法可以接受 3 个函数作为参数。
前两个函数对应 promise 的两种状态 fulfilled 和 rejected 的回调函数。第三个函数用于处理进度信息(对进度回调的支持是可选的)。
promiseSomething().then(function(fulfilled){ //当promise状态变成fulfilled时,调用此函数 },function(rejected){ //当promise状态变成rejected时,调用此函数 },function(progress){ //当返回进度信息时,调用此函数 });
Promise.all(),支持传入一个promises数组,当所有promises都完成时执行then
如果说Primise.all是promise对象之间的“与”关系,那么Promise.race就是promise对象之间的“或”关系 (只要有一个完成 就执行)
// ajax queue 类似 promise的 all $.when($.ajax(options1), $.ajax(options2)) .then(function() { console.log('all done.'); }, function() { console.error('There something wrong.'); });