Promise.resolve等價於下面的寫法
有時需要將現有對象轉為 Promise 對象,Promise.resolve方法就起到這個作用。
Promise.resolve('foo') // 等價於 new Promise(resolve => resolve('foo'))
Promise.resolve方法的參數分成四種情況
參數是一個 Promise 實例
如果參數是 Promise 實例,那么Promise.resolve將不做任何修改、原封不動地返回這個實例。
參數是一個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方法的參數,會同時傳給回調函數
廣州品牌設計公司https://www.houdianzi.com PPT模板下載大全https://redbox.wode007.com
不帶有任何參數
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 事件隊列的所有運行時結束了,事件隊列被清空之后,才開始執行
resolve()本質作用
- resolve()是用來表示promise的狀態為fullfilled,相當於只是定義了一個有狀態的Promise,但是並沒有調用它;
- promise調用then的前提是promise的狀態為fullfilled;
- 只有promise調用then的時候,then里面的函數才會被推入微任務中;
