网站搜索

javascript - 为什么 Promise.all() 允许非 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];
});

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

答案#1

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

你可以传入一个 Promise、一个 thenable 或者其他值。当它是:

  • 本地 Promise 的一个实例(即其原型是 Promise.prototype),那么它将返回该对象(不会创建新的 promise)。
  • 另一个 thenable —— 包括来自其他库的 promise 或本地 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) );

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) );