Javascript NodeJS:使用异步操作逐个删除数组项
我需要对数组的每个项进行操作,并且该操作是异步的。只有在处理第一个项目时,我才需要继续下一个项目。如果所有项目都已处理,我需要返回true。 这段代码本身应该是一个承诺,我可以把它挂在上面 这就是我尝试做的: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
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方法第二次。