【问题标题】:How can I put elements in Promise.all() array conditionally?如何有条件地将元素放入 Promise.all() 数组中?
【发布时间】:2021-09-30 09:17:37
【问题描述】:

下面的代码是我写的。
我知道'await'关键字不应该在for循环中。

const booksNotBackedUp: number[] = [];
for (let i = 0; i < usersBooks.length; i += 1) {
        const files = await Util.file.getFiles(Util.file.DATA_BUCKET, { prefix: `${userId}/data/${usersBooks[i]}/sqlite` });
        if (files.length === 0) booksNotBackedUp.push(usersBooks[i]);
    }
console.log('booksNotBackedUp', booksNotBackedUp);

所以,我尝试过这样,但“结果”包含“userBooks”中的所有元素,这不是我想要的。

const booksNotBackedUp: any[] = [];
userBooks.forEach((book) => {
    booksNotBackedUp.push(Util.file.getFiles(Util.file.DATA_BUCKET, { prefix: `${userId}/data/${book}/sqlite` })
})
const result = await Promise.all(booksNotBackedUp);
console.log('booksNotBackedUp', result);

请帮助这个可怜的新手????

【问题讨论】:

  • 根据某些条件过滤Promise.all()之后的结果。
  • 你得到了什么结果?你有什么期望?
  • “那不是我想要的。”:不清楚你想要什么。您在寻找:const result = (await Promise.all(booksNotBackedUp)).filter(files =&gt; !files.length);
  • @Braks,不,这是一种反模式。 getFiles 已经返回了承诺。无需再创建一个。
  • @Braks:What is the explicit promise construction antipattern and how do I avoid it?。 Asker 正在在两个代码块 (getFiles) 中调用异步函数。

标签: javascript typescript async-await promise


【解决方案1】:

您将承诺添加到数组中的条件位于承诺结果中。由于promise尚未解决,因此无法预先在数组中添加promise。

您可以在 promise.all() 解决后进行过滤。在这种情况下,您将获得所有结果,您可以使用数组的过滤器方法。

【讨论】:

    猜你喜欢
    • 2019-06-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 2014-05-06
    相关资源
    最近更新 更多