Promise

作者: Cissy_fba3 | 来源:发表于2018-09-15 21:08 被阅读0次

    Promise 对象是 JavaScript 的异步操作解决方案,为异步操作提供统一接口。它是一个对象,也是一个构造函数。为解决回调函数的嵌套(回调地狱)而存在。

    可以把 Promise 看成一个状态机。初始是 pending 状态,可以通过函数 resolve 和 reject ,将状态转变为 resolved 或者 rejected 状态,状态一旦改变就不能再次变化。

    promise实例

    var p1 = new Promise(function(resolve, reject) {
       if(/*异步操作成功*/){
          resolve(value)
        }else{/*异步操作失败*/
          reject(new error())
        }
    });
    

    resolve函数的作用是,将Promise实例的状态从“未完成”变为“成功”,在异步操作成功时调用,并将异步操作的结果,作为参数传递出去。reject函数的作用是,将Promise实例的状态从“未完成”变为“失败”,在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

    then方法

    var p1 = new Promise(function (resolve, reject) {
      resolve('成功');
    });
    p1.then(console.log, console.error);
    // "成功"
    
    var p2 = new Promise(function (resolve, reject) {
      reject(new Error('失败'));
    });
    p2.then(console.log, console.error);
    // Error: 失败
    

    Promise 实例的then方法,用来添加回调函数。
    then 函数会返回一个 Promise 实例,并且该返回值是一个新的实例而不是之前的实例。因为 Promise 规范规定除了 pending 状态,其他状态是不可以改变的。
    then方法可以接受两个回调函数,第一个是异步操作成功时的回调函数,第二个是异步操作失败时的回调函数(该参数可以省略)。

    p1
      .then(step1)
      .then(step2)
      .then(step3)
      .then(
        console.log,
        console.error
      );
    

    上面代码中,p1后面有四个then,意味依次有四个回调函数。只要前一步的状态变为fulfilled(成功),就会依次执行紧跟在后面的回调函数。
    最后一个then方法,回调函数是console.log和console.error,用法上有一点重要的区别。console.log只显示step3的返回值,而console.error可以显示p1、step1、step2、step3之中任意一个发生的错误。举例来说,如果step1的状态变为rejected,那么step2和step3都不会执行了(因为它们是resolved的回调函数)。Promise 开始寻找,接下来第一个为rejected的回调函数,在上面代码中是console.error。这就是说,Promise 对象的报错具有传递性
    如何自己生成Promise对象

    function xxx(){
      return new Promise(function(resolve,reject){
        setTimeOut(()=>{
          resolve()或者reject()
          },3000)
      })
    }
    xxx().then(...)
    

    相关文章

      网友评论

          本文标题:Promise

          本文链接:https://www.haomeiwen.com/subject/mcptnftx.html