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.');  
 });  
⚠️ **GitHub.com Fallback** ⚠️