代码之家  ›  专栏  ›  技术社区  ›  Daniel A. White

用Typescript中的数组迭代简化异步等待

  •  3
  • Daniel A. White  · 技术社区  · 8 年前

    有没有一种更简单的方法可以在Typescript中表达这种语法,而不需要 Promise.all 和 Array.prototype.map ?

    const items = [...];
    await Promise.all(items.map(async item => {
        doSomething(item);
        const result = await doSomethingAsync(item);
        doSomethingMore(result, item);
    });
    
    1 回复  |  直到 8 年前
        1
  •  4
  •   Estus Flask    8 年前

    ES5数组方法不完全支持 async 还有发电机的功能,这就是原因之一 for 和其他循环语句应优先于 forEach 在ES6中。

    在这种情况下 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);
    });