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外面的函数才会被推入微工作中;