NodeJS:逐个使用异步操作删除数组项

时间:2018-06-02 13:41:31

标签: javascript promise async-await

我需要对数组的每个项进行操作,并且该操作是异步操作。我只有在处理第一个项目时才需要继续下一个项目。如果处理完所有项目,我需要返回true。 这段代码本身应该是我可以链接的承诺。

这是我尝试过的:

<div class="flexBox">
  <div><img src="http://placehold.it/100x100" alt=""></div>
  <div><a class="navbutton" href="https://google.com">Home</a></div>
  <div><a class="navbutton" href="https://google.com">FAQ</a></div>
  <div><a class="navbutton" href="https://google.com">Log in</a></div>
</div>

3 个答案:

答案 0 :(得分:0)

如果您想检查所有操作是否已经结束,您应该使用Promise.all,这样您就不必自己跟踪所有异步操作。

async deleteAll(items) {
    await Promise.all(
       items.map(element => this.deleteOne(element))
    );
    items.splice(0, items.length); // clear items
}

您的代码无法正常工作,因为它会在数组中的最后一项被删除时触发,这不一定是从数据库中删除的最后一项。

如果您想按顺序运行它,而不是使用Promise.all,则可以使用简单的for of循环

async deleteAll(items) {
    for(const item of items)
       await this.deleteOne(item);
    // I'm done with all the items
    items.splice(0, items.length);
}

不要忘记.catch任何拒绝:

deleteAll([1,2]).catch(err => console.log(err))

try/catch如果它在async函数中,并且您正在使用await

答案 1 :(得分:0)

只需使用旧的for循环:

async function deleteAll(items) {
  for(const el of items) {
    await this.deleteOne(el);
  }
  items.splice(0, items.length);
  return true;
}

答案 2 :(得分:0)

你应该写这样的东西:

async deleteAll(items) {
  for(let element of items) {
    await this.deleteOne(element);
  }
  items.length = 0
}

只要this.deleteOne成功解析,您的代码就可以正常运行。但如果this.deleteOne失败并且此承诺被拒绝,那么您将遭到未经处理的拒绝。

未处理的拒绝会在将来的版本中崩溃您的整个节点应用程序。

创建一个新的Promise(new Promise((resolve,reject)=>{ .. })并使用另一个Promise与新创建的Promise一起表明你做错了。