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方法的參數,會同時傳給回調函數
不帶有任何參數
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裡面的函數才會被推入微任務中;
最後推薦一個 js常用的utils合集,幫我點個star吧~
- github
- 文檔