【问题标题】:Simplify async-await with array iteration in Typescript在 Typescript 中使用数组迭代简化 async-await
【发布时间】:2018-10-26 21:48:19
【问题描述】:

没有Promise.all 和Array.prototype.map,有没有更简单的方法在 Typescript 中表达这种语法?

const items = [...];
await Promise.all(items.map(async item => {
    doSomething(item);
    const result = await doSomethingAsync(item);
    doSomethingMore(result, item);
});

【问题讨论】:

  • 没有。为什么你觉得不够简单?
  • 如果你想同时做所有的承诺,你必须使用Promise.all
  • 我认为记住使用 .map
  • @DanielA.White 我认为 typescript 没有任何类型的数组理解
  • @DanielA.White 除了map 之外,您会使用什么来创建承诺数组?

标签: typescript promise async-await


【解决方案1】:

ES5 数组方法不完全支持 async 和生成器函数,这就是为什么在 ES6 中 for 和其他循环语句应该优先于 forEach 的原因之一。

在这种情况下,map 被部分滥用,因为它不管理数组值。如果应并行解决承诺,则可能应该是:

items = await Promise.all(items.map(async item => {
    doSomething(item);
    const result = await doSomethingAsync(item);
    doSomethingMore(result, item);
    return item;
});

不是很简单,但可能在语义上是正确的。如果do.. 函数修改item 使其类型发生变化,const newItems = await Promise.all(...) 也可以更轻松地管理项目类型。

如果它们应该连续解决并且不需要涉及Promise.all,则可以是for..of:

for (const item of items) {
    doSomething(item);
    const result = await doSomethingAsync(item);
    doSomethingMore(result, item);
});

【讨论】:

    猜你喜欢
    • 2021-04-30
    • 2020-05-19
    • 2016-08-22
    • 2017-10-03
    • 2017-07-13
    • 2017-05-29
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多