es6 Promise.resolve()方法
Promise.resolve()方法
有時需要將現有物件轉為 Promise 物件,Promise.resolve
方法就起到這個作用。
const jsPromise = Promise.resolve($.ajax('/whatever.json'));
上面程式碼將 jQuery 生成的deferred
物件,轉為一個新的 Promise 物件。
Promise.resolve
等價於下面的寫法。
Promise.resolve('foo')
// 等價於
new Promise(resolve => resolve('foo'))
Promise.resolve
方法的引數分成四種情況。
(1)引數是一個 Promise 例項
如果引數是 Promise 例項,那麼Promise.resolve
將不做任何修改、原封不動地返回這個例項。
(2)引數是一個thenable
物件
thenable
物件指的是具有then
方法的物件,比如下面這個物件。
let thenable = {
then: function(resolve, reject) {
resolve(42);
}
};
Promise.resolve
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。
(3)引數不是具有then
方法的物件,或根本就不是物件
如果引數是一個原始值,或者是一個不具有then
方法的物件,則Promise.resolve
方法返回一個新的 Promise 物件,狀態為resolved
。
const p = Promise.resolve('Hello');
p.then(function (s){
console.log(s)
});
// Hello
上面程式碼生成一個新的 Promise 物件的例項p
。由於字串Hello
不屬於非同步操作(判斷方法是字串物件不具有 then 方法),返回 Promise 例項的狀態從一生成就是resolved
,所以回撥函式會立即執行。Promise.resolve
方法的引數,會同時傳給回撥函式。
(4)不帶有任何引數
Promise.resolve
方法允許呼叫時不帶引數,直接返回一個resolved
狀態的 Promise 物件。
所以,如果希望得到一個 Promise 物件,比較方便的方法就是直接呼叫Promise.resolve
方法。
const p = Promise.resolve();
p.then(function () {
// ...
});
上面程式碼的變數p
就是一個 Promise 物件。
需要注意的是,立即resolve
的 Promise 物件,是在本輪“事件迴圈”(event loop)的結束時,而不是在下一輪“事件迴圈”的開始時。
setTimeout(function () {
console.log('three');
}, 0);
Promise.resolve().then(function () {
console.log('two');
});
console.log('one');
// one
// two
// three
上面程式碼中,setTimeout(fn, 0)
在下一輪“事件迴圈”開始時執行,Promise.resolve()
在本輪“事件迴圈”結束時執行,console.log('one')
則是立即執行,因此最先輸出。
轉載於:https://blog.csdn.net/ixygj197875/article/details/79183843