关于promise:Promiseresolve与new-Promiser-rv

5次阅读

共计 2364 个字符,预计需要花费 6 分钟才能阅读完成。

Promise.resolve 办法的参数分成四种状况。

参数是一个 Promise 实例

如果参数是 Promise 实例,那么 Promise.resolve 将不做任何批改、一成不变地返回这个实例。
这是一个非凡的状况会和另一种 new Promise(r => r(v))产生不一样的成果,最初阐明

参数是一个 thenable 对象

thenable 对象指的是具备 then 办法的对象,比方上面这个对象

let thenable = {then: function(resolve, reject) {resolve(42);
  }
};

Promise.resolve 办法会将这个对象转为 Promise 对象,而后就立刻执行 thenable 对象的 then 办法。

let thenable = {then: function(resolve, reject) {resolve(42);
  }
};

let p1 = Promise.resolve(thenable);
p1.then(function(value) {console.log(value);  // 42
});

thenable 对象的 then 办法执行后,对象 p1 的状态就变为 resolved,从而立刻执行最初那个 then 办法指定的回调函数,输入 42

参数不是具备 then 办法的对象,或基本就不是对象

如果参数是一个原始值,或者是一个不具备 then 办法的对象,则 Promise.resolve 办法返回一个 新的 Promise 对象,状态为 resolved。

const p = Promise.resolve('Hello');

p.then(function (s){console.log(s)
});
// Hello

因为字符串 Hello 不属于异步操作(判断办法是字符串对象不具备 then 办法),返回 Promise 实例的状态从毕生成就是 resolved,所以回调函数会执行。Promise.resolve 办法的参数,会同时传给回调函数

不带有任何参数

Promise.resolve 办法容许调用时不带参数,间接返回一个 resolved 状态的 Promise 对象。

setTimeout(function () {console.log('three');
}, 0);

Promise.resolve().then(function () {console.log('two');
});

console.log('one');

// one
// two
// three

.then()函数里不返回值或者返回的不是 promise,那么 then 返回的 Promise 将会成为承受状态(resolve)

Promise.resolve().then(() => console.log(2)).then(() => console.log(3));
console.log(1); // 1, 2, 3

须要留神的是,立刻 resolve 的 Promise 对象,是在本轮“事件循环”(event loop)的完结时执行执行,不是马上执行, 也不是在下一轮“事件循环”的开始时执行
起因:传递到 then() 中的函数被置入了一个微工作队列,而不是立刻执行,这意味着它是在 JavaScript 事件队列的所有运行时完结了,事件队列被清空之后,才开始执行

Promise.resolve(v)不等于new Promise(r => r(v))

当 v 是一个 Promise 实例的时候就会呈现一些不同的中央

 // v 是一个实例化的 promise,且状态为 fulfilled
    let v = new Promise(resolve => {console.log("begin");
      resolve("then");
    });

    // 在 promise 外面 resolve 一个状态为 fulfilled 的 promise

    // 模式一 new Promise 里的 resolve()
    // begin->1->2->3->then->4 能够发现 then 推延了两个时序
    // 推延起因:浏览器会创立一个 PromiseResolveThenableJob 去解决这个 Promise 实例,这是一个微工作。// 等到下次循环到来这个微工作会执行,也就是 PromiseResolveThenableJob 执行中的时候,因为这个 Promise 实例是 fulfilled 状态,所以又会注册一个它的.then()回调
    // 又等一次循环到这个 Promise 实例它的.then()回调执行后,才会注册上面的这个.then(), 于是就被推延了两个时序
    new Promise(resolve => {resolve(v);
    }).then((v)=>{console.log(v)
    });

    //  模式二 Promise.resolve(v)间接创立
    // begin->1->then->2->3->4 能够发现 then 的执行工夫失常了,第一个执行的微工作就是上面这个.then
    // 起因:Promise.resolve()API 如果参数是 promise 会间接返回这个 promise 实例,不会做任何解决
/*     Promise.resolve(v).then((v)=>{console.log(v)
    }); */

    new Promise(resolve => {console.log(1);
      resolve();})
      .then(() => {console.log(2);
      })
      .then(() => {console.log(3);
      })
      .then(() => {console.log(4);
      });

resolve()实质作用

  • resolve()是用来示意 promise 的状态为 fullfilled,相当于只是定义了一个有状态的 Promise,然而并没有调用它;
  • promise 调用 then 的前提是 promise 的状态为 fullfilled;
  • 只有 promise 调用 then 的时候,then 外面的函数才会被推入微工作中;
正文完
 0