2017-04-04 99 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的承诺。时间打开基础知识书.. –

相关问题