Promise 通常被定义为最终会变为可用值的代理,是一种处理异步代码的方式。
运作方式
当promise被调用后,它会以处理中状态开始。 这意味着调用的函数会继续执行,而promise仍处于处理中直到解决为止,从而为调用的函数提供所请求的任何数据。
被创建的promise最终会以被解决状态或被拒绝状态结束,并在完成时调用相应的回调函数(传给 then 和 catch)。
可以把promise简单理解成一个容器,存放着某个未来才会结束的事件的结果(通常是一个异步操作)。通过promise对象来获取异步操作消息,处理各种异步操作。
特点
对象的状态不受外界影响,只与异步操作的结果有关。
Promise对象代表一个异步操作,有三种状态:**pending**(进行中)、**fulfilled**(已成功)和**rejected**(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。一旦状态改变,就不会再变,任何时候都可以得到这个结果。
Promise对象的状态改变,只有两种可能:从**pending**变为**fulfilled**和从**pending**变为**rejected**。只要这两种情况发生,状态就不会再变了,会一直保持这个结果,这时就称为**resolved**(已定型)。如果改变已经发生了,再对**Promise**对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
基本使用
Promise为一个构造函数,需要用new来实例化。
let p = new Promise((resolve, reject) => {if(/*异步操作成功*/){resolve(value);} else {reject(error);}})
resolve作用是将Promise的状态从pending变成resolved,在异步操作成功时调用,返回异步操作的结果,作为参数传递出去。reject作用是将Promise的状态从pending变成rejected,在异步操作失败时报错,作为参数传递出去。- 如果在执行路径中从未调用过这些函数之一,则
promise会保持pending状态。
Promise实例生成以后,可以用.then()方法将参数中的函数添加到当前 Promise 的正常执行序列,分别指定resolved状态和rejected状态的回调函数。
p.then(function(val){// success...},function(err){// error...})
resolve()中可以放置一个参数用于向下一个then传递一个值,then中的函数也可以返回一个值传递给 then。
new Promise(function (resolve, reject) {console.log(1111);resolve(2222);}).then(function (value) {console.log(value);return 3333;}).then(function (value) {console.log(value);throw "An error";}).catch(function (err) {console.log(err);});// 1111// 2222// 3333// An error
如果then中返回的是一个Promise对象,那么下一个then将相当于对这个返回的Promise进行操作。
简单辨析
不使用promise,令ajax同步(async: false),阻塞了下面:

使用promise,异步。

参考: https://www.bilibili.com/video/BV1ch411k7Ud https://www.runoob.com/js/js-promise.html http://js.pingan8787.com/
