2017-04-04 174 views
-1

爲什麼Promise.all()允許任何對象作爲迭代被傳入?爲什麼Promise.all()允許非Promise對象?

例如(的jsfiddle:https://jsfiddle.net/npqgpcud/6/):

var promise1 = "one"; 
var promise2 = 2222; 
var promise3 = new Promise(function (fulfill, reject) { 
    fulfill("three"); 
}); 

Promise.all([promise1, promise2, promise3]).then(results => { 
    p1.innerHTML = results[0]; 
    p2.innerHTML = results[1]; 
    p3.innerHTML = results[2]; 
}); 

如果我想模仿這種行爲的單一承諾,有沒有推薦的解決方案,或者將它推薦給使用Promise.all([承諾])?

+1

你的意思是,如果你想創建一個***解決了一個承諾,以***一個你已經擁有的價值? –

+1

爲什麼?因爲它允許任何[可用](http://stackoverflow.com/q/29435262/1048572),而不僅僅是承諾,並且'Promise.resolve'算法也可以處理普通值。當你知道一個變量從不包含承諾時,你不應該使用這個。 – Bergi

回答

1

一個值的等價物是Promise.resolve()

您可以傳遞承諾或其他價值。後者將立即用該價值解決承諾。

一些例子:

const wait = ms => new Promise(resolve => setTimeout(resolve, ms)); 
 

 
console.log('start'); 
 
Promise.resolve(wait(1000)).then(_ => console.log('done')); 
 
Promise.resolve(42).then(data => console.log(data)); 
 
Promise.resolve(Promise.reject('oh no')).catch(data => console.log(data));

唯一的區別在於Promise.all([one value])具有是,它仍然會產生一個值的數組。

見解析值(42)所顯示的略有不同:

const wait = ms => new Promise(resolve => setTimeout(resolve, ms)); 
 

 
console.log('start'); 
 
Promise.all([wait(1000)]).then(_ => console.log('done')); 
 
Promise.all([42]).then(data => console.log(data)); 
 
Promise.all([Promise.reject('oh no')]).catch(data => console.log(data));

+0

謝謝trincot和Bergi,這太棒了!我正在向後學習JavaScript的承諾。時間打開基礎知識書.. –