NodeJS асинхронный / ожидание - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть следующий код

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'), но " Complete "печатается до запуска forEach?

Ответы [ 2 ]

3 голосов
/ 25 апреля 2020

Вместо обратного вызова forEach используйте for l oop, чтобы вы оставались во внешней функции 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, ... et c.

2 голосов
/ 25 апреля 2020

Вы также можете использовать 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')
}
...