为什么 Promise.all() 允许非 Promise 对象?

Ala*_*lan 4 promise es6-promise

为什么 Promise.all() 允许将任何对象作为可迭代对象传递?

示例(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];
});
Run Code Online (Sandbox Code Playgroud)

如果我想为单个承诺模仿这种行为,是否有推荐的解决方案或者建议使用 Promise.all([promise]) ?

tri*_*cot 5

一个值的等价物是Promise.resolve().

你可以向它传递一个 Promise、一个 thenable 或另一个值。几时:

  • 原生 Promise 的实例(即它的原型是Promise.prototype),然后返回该对象(不创建 Promise)。
  • 另一个thenable——包括来自另一个库的promise或本地promise的扩展——然后它返回一个新的Promise(包装器)
  • 如果有其他情况,它会返回一个新的 Promise,并立即使用给定的值进行解析。

一些例子:

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) );
Run Code Online (Sandbox Code Playgroud)

唯一的区别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) );
Run Code Online (Sandbox Code Playgroud)