有時須要將現有對象轉爲 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