我有以下代码
removeApps: async () => {
common.header('Remove Apps')
const value = await inquirer.removeAppsList();
value.removeAppsList.forEach(async (element) => {
await shellExec('adb shell pm uninstall -k --user 0 ' + element).then(async function (result) {
console.log('Removing ' + element + ' - ' + result.stdout)
}).catch()
});
console.log('complete')
},
forEach遍历数组并处理数组中的所有值,完成后,我要console.log('complete'),但是在“ forEach”启动之前打印“ Complete”?
答案 0 :(得分:3)
使用forEach
循环而不是for
回调,这样您就可以留在外部async
函数中,并且等待多个await
,一个接一个另一个:
for (let element of value.removeAppsList) {
await shellExec('adb shell pm uninstall -k --user 0 ' + element).then(function (result) {
console.log('Removing ' + element + ' - ' + result.stdout);
});
}
请勿将async
用作then
回调函数。计划在该函数中使用async
时,您只需要await
。
请记住,当您调用async
函数时,它会在处理await
的那一刻返回。它不会等到返回。但是,一旦等待的承诺解决(调用堆栈为空),函数上下文就会恢复,并且执行会继续进行,直到下一个await
,...等。
答案 1 :(得分:2)
如果您不想等每个诺言都解决后再调用下一个诺言,也可以使用Promise.all。
Promise.all
将在数组中的一个承诺被拒绝后立即拒绝,如果您不希望可以使用Promise.allSettled或在返回的承诺上添加.catch
。
removeApps: async () => {
common.header('Remove Apps')
const value = await inquirer.removeAppsList()
await Promise.all(
value.removeAppsList.map(element =>
shellExec('adb shell pm uninstall -k --user 0 ' + element).then(res =>
console.log('Removing ' + element + ' - ' + result.stdout),
),
),
)
console.log('complete')
}