ECMAScript 6---Promise对象

所谓promise,其实就是异步编程的一种解决方案。

特点:

promise对象状态不受外界影响(由异步操作的结果决定)。

  1. pending:进行中
  2. resolved(fulfilled):已完成
  3. rejected:已失败

一旦状态改变,将不会再变(状态凝固,保持不变)

  1. pending → resolved
  2. pending → rejected

缺点:

  1. 无法中途取消promise
  2. 如果不设置回调函数,promise内部抛出的错误无法反应到外部
  3. pending状态下,无法得知进展阶段

==============================================

var promise = new Promise( (resolve,reject) => {

if (/*异步操作成功*/) {

    resolve(value);

} else {

    reject(error);

}

} )

==============================================

注:Promise是一个构造函数,用来创建promise实例。参数为一个函数,该函数有两个参数:

  1. resolve:当异步操作返回成功时调用,并将结果传递给回调函数
  2. reject:当异步操作返回失败时调用,并将错误信息传递给回调函数

==============================================

promise.then ( (value) => {

//success

}, (err) => {

//failure

} )

==============================================

注:then方法可以传递两个回调函数作为参数(两个函数均接受promise对象传出的值作为参数)

  1. 第一个回调函数为Promise状态pending → resolve时调用
  2. 第二个回调函数为Promise状态pending → reject时调用,可选

p1和p2是两个promise实例,当p2的resolve方法将p1作为参数时:

  1. p1为pending状态时,p2的回调函数会等待p2状态的改变;
  2. p2为resolve状态时,p2的回调函数立即调用
  3. p2为reject状态时,p2的回调函数立即调用,但是此时p2的状态无效,以p1状态为准,触发p2回调函数中的catch方法

Promise.prototype.then()

then方法返回的是一个新的promise实例,因此可以采用链式写法(前一个回调函数执行完毕,会把返回的结果作为参数传递给下一个回调函数,以此类推)

Promise.prototype.catch()

和.then(null,reject)等价,用于指定发生错误时的回调。异步操作状态变为reject时,调用catch方法,当then方法内抛出异常时,也会被catch方法捕获

Promise.all()

用于将多个promise实例包装成一个promise实例,参数为一个包含多个promise实例的数组,如果数组元素不是promise实例,会先调用Promise.resolve方法转换为promise实例

  1. p1, p2, p3均为resolve时,返回的p也为resolve
  2. p1, p2, p3有一个为reject时,p为reject,此时第一个被reject的返回值会传递给p的回调函数

Promise.race()

参数同all方法,不同的是,当参数中的实例有一个返回率先改变状态,p的状态便随之改变。

Promise.resolve()

将现有对象转换为promise对象。

  1. 参数是一个promise实例时,不做修改返回。
  2. 参数是一个thenable(含有then方法的对象)时,会先转换为promise对象,并立即执行thenable对象内的then方法。
  3. 参数不是一个对象时,返回一个新的promise对象,状态为resolve。
  4. 当没有参数时,直接返回一个状态为resolve的promise对象。

Promise.reject()

返回一个状态为reject的promise对象。

done()

处于回调链的尾端,保证最后一个then或者catch方法抛出的错误可以接收到。

finally()

无论最后的状态是哪一个,都会执行的代码块。

你可能感兴趣的:(ECMAScript 6---Promise对象)