【问题标题】:Promise.all with different return types [closed]具有不同返回类型的 Promise.all [关闭]
【发布时间】:2019-08-07 02:49:48
【问题描述】:

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

例如 promise.all([promiseA, promiseB, promiseC], promiseA 和 promiseB 返回 void 但 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}

提前致谢

【问题讨论】:

  • 你的意思是,不同的 resolve 类型?
  • 是的,这是可能的。你到底尝试了什么?
  • 结果可能完全不同。例如,使用 Promise.all 调用许多 api 方法是很常见的。在这种情况下,可迭代对象只是看起来像列表的东西。
  • returns void - 那是什么?

标签: javascript typescript promise iterable


【解决方案1】:

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

返回一个 Promise,当所有的 Promise 都通过时,它会解析 作为可迭代对象已解决或当可迭代对象不包含 承诺。它以第一个承诺的理由拒绝 拒绝。

已解决的承诺将是:

...用一个数组实现,该数组包含作为参数传递的可迭代的所有值(也是非承诺值)。

它的返回类型是一个数组,但是因为 javascript 数组中的每个元素都可以包含任何类型,所以您可以完全按照您的描述进行操作。下面是一个示例,从控制台输出中您可以看到 undefined 为其中两个元素以及 NumberString 类型返回。

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

【讨论】:

  • 感谢您的回复,我用我的代码和我看到的错误更新了问题,可能是因为 TypeScript 吗?
  • 对 TypeScript 不太熟悉,但是你尝试过 Promise 吗?或者将 promise 的返回类型设置为数组?
  • 或者将返回类型声明为 Promise ?
  • @adamrights 如果我们有超过 10 个返回不同类型的承诺,如何使用它。在这种情况下,TypeScript 会出错,因为它最多只能接受 10 个 Promise。你能告诉我在这种情况下如何解决吗?
  • 把它分成两个 promise.all() 在这种情况下可能是最简单的(=
猜你喜欢
  • 1970-01-01
  • 2019-12-29
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多