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