Promise

作者: 九又四分之三o | 来源:发表于2017-05-20 21:08 被阅读0次

    Promise是一个对象,用来传递异步操作的消息。它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的API,可供进一步处理。
    Promise对象有以下两个特点:
    1、对象的状态不受外部影响。Promise对象代表一个异步操作,有3种状态:Pending(进行中)、Resolved(已完成)、Rejected(已失败)。只有异步操作的结果才可以决定当前是哪种状态,任何其他操作都无法改变这个状态。这也是“Promise”这个名字的由来。
    2、一旦状态改变就不会再变,任何时候都可以得到这个结果。

    var promise = new Promise(function(resolve, reject){
     //some code
      if(/*异步操作成功*/){
        resolve(value);
      } else {
        reject(err)
      }
    });
    

    Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由JavaScript引擎提供,不用自己部署。
    resolve的作用是,将Promise对象的状态从“Pending”变为“Resolved”,在异步操作成功时调用,并<b>将异步操作的结果作为参数传递出去;</b>
    reject的作用是,将Promise对象的状态从“Pending”变为“Rejected”,在异步操作失败时调用,并<b>将异步操作报的错误作为参数传递出去;</b>
    Promise实例生成以后,可以用then方法分别指定Resolved状态和Rejected状态的回调函数。then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为Resolved时调用,第二个回调函数是Promise对象的状态变为Rejected时调用。其中,第二个函数是可选的,不一定要成功。这两个函数都接受Promise对象传出的值作为参数。

    function timeout(ms) {
      return  new Promise((resolve, reject) => {
      setTimeout(resolve, ms , 'done');//经测试,第三个参数及后面的参数会被当做resolve函数的参数。
    });
    }
    timeout(100).then((value) => {
      console.log(value);
    });
    

    <b>如果调用resolve函数和reject函数时带有参数,那么这些参数会被传递给回调函数</b>
    上述代码中,timeout方法返回一个Promise实例,表示一段时间以后才会发生的结果。过了指定时间以后,执行resolve函数,将Promise对象从pending改为Resolved,状态变为Resolved会调用then方法里的第一个回调函数。同样,如果将setTimeout里的第一个参数改为resolve的话,Promise对象从pending变为Rejected,状态变为Rejected会调用then方法里的第二个回调函数。

    相关文章

      网友评论

          本文标题:Promise

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