NodeJS异步/等待

时间:2020-04-25 10:48:40

标签: javascript node.js async-await

我有以下代码

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”?

2 个答案:

答案 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')
}