有时须要将现有对象转为 Promise 对象,Promise.resolve方法就起到这个做用。promise
Promise.resolve('foo') // 等价于 new Promise(resolve => resolve('foo'))
若是参数是 Promise 实例,那么Promise.resolve将不作任何修改、原封不动地返回这个实例。异步
thenable对象指的是具备then方法的对象,好比下面这个对象函数
let thenable = { then: function(resolve, reject) { resolve(42); } };
Promise.resolve方法会将这个对象转为 Promise 对象,而后就当即执行thenable对象的then方法。oop
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方法指定的回调函数,输出 42code
若是参数是一个原始值,或者是一个不具备then方法的对象,则Promise.resolve方法返回一个新的 Promise 对象,状态为resolved。对象
const p = Promise.resolve('Hello'); p.then(function (s){ console.log(s) }); // Hello
因为字符串Hello不属于异步操做(判断方法是字符串对象不具备 then 方法),返回 Promise 实例的状态从一辈子成就是resolved,因此回调函数会执行。Promise.resolve方法的参数,会同时传给回调函数three
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 事件队列的全部运行时结束了,事件队列被清空以后,才开始执行ip