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

Javascript NodeJS:使用异步操作逐个删除数组项,javascript,promise,async-await,Javascript,Promise,Async Await,我需要对数组的每个项进行操作,并且该操作是异步的。只有在处理第一个项目时,我才需要继续下一个项目。如果所有项目都已处理,我需要返回true。 这段代码本身应该是一个承诺,我可以把它挂在上面 这就是我尝试做的: deleteAll(items) { return new Promise((resolve,reject)=>{ items.forEach(async element => { await this.deleteOne(ele

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

这就是我尝试做的:

deleteAll(items) {
    return new Promise((resolve,reject)=>{
        items.forEach(async element => {
            await this.deleteOne(element); //Async delete operation
            items.shift();
            if(items.length-1==index)   resolve(true)
        });
    });
}

如果您想检查是否所有操作都已结束,则可能应该使用
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);
}
不要忘记
。捕获任何拒绝:

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

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

只需使用一个好的旧for循环:

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

你应该这样写:

async deleteAll(items) {
  for(let element of items) {
    await this.deleteOne(element);
  }
  items.length = 0
}
只要
this.deleteOne
成功解析,您的代码就可以工作。但是如果
this.deleteOne
失败,并且此承诺被拒绝,那么您将收到未经处理的拒绝

而未经处理的拒绝将使未来版本中的整个节点应用程序崩溃


创建一个新的承诺(
newpromise((resolve,reject)=>{..}
)并在新创建的承诺中使用另一个承诺总是表示您做了错事。

谢谢!正如我提到的,我想在第一次出现完成时,而不是并行调用deleteOne方法第二次。