Promise.all具有不同的返回类型

时间:2019-03-16 01:05:24

标签: javascript typescript promise iterable

Promise.all()获得一个可迭代的输入,promise.all是否可能具有不同的解析类型?

示例将是promise.all([promiseA,promiseB,promiseC],promiseA和promiseB返回空值,但是promiseC返回布尔值吗?

我尝试过,似乎不可能,而且我也不认为迭代器可以具有不同的类型,但想确定。这是我看到的错误,这是我使用TypeScript的代码

PromiseC: Promise<boolean>;
PromiseA: Promise<void>;
PromiseB: Promise<void>;

const promises = [this.promiseA, this.promiseB];
if (!flag) {
   promises.push(this.promiseC); 
}
Promise.all(promises).then(() => { // do something}

enter image description here

预先感谢

1 个答案:

答案 0 :(得分:2)

是的,您可以将其与返回不同类型的Promise一起使用。 Promise.all(iterable)MDN documentation一样:

  

返回一个Promise,该Promise在所有诺言都通过时解决   作为可迭代项已解决或当可迭代项不包含   承诺。它拒绝第一个承诺的理由是   拒绝。

解决的承诺将是:

  

...用一个数组完成,该数组包含作为参数传递的所有iterable值(也包括非承诺值)。

它的返回类型是一个Array,但是由于javascript数组中的每个元素都可以包含任何类型,因此您可以执行您所描述的操作。下面是一个示例,从控制台输出中,您可以看到为两个元素以及undefinedNumber类型返回了String

var p1 = new Promise((resolve, reject) => {
  resolve(console.log("Doing work...then I return undefined like a function does"))
})
var p2 = undefined;
var p4 = Promise.resolve(true)
var p3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("foo");
  }, 100);
}); 

Promise.all([p1, p2, p3, p4]).then(values => { 
  console.log(values); // Array contains multiple types.
});