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

Я просто не могу разобраться с этим: (

    compatibleApps: async () => {
        common.header('Install Compatible Apps')
        const compatibleApps = JSON.parse(fs.readFileSync('./data/compatibleApps.json', 'utf8'));
        const value = await inquirer.compatibleApps();

        for (let element of value.removeAppsList) {
            for (let element2 of compatibleApps) {
                if (element === element2.name) {
                    await files.downloadFile(element2)
                }
            }
        }

        await adb.installApk()
    },

await adb.installApk () выполняется до того, как все вызовы await files.downloadFile (element2) были завершены). .

Ниже приведено содержимое файла downloadFile. Думаю, мне нужно обернуть его в обещание?

downloadFile: async (element) => {
    option = {
      dir: './data/apps',
      onDone: (info)=>{
          console.log('Latest ' + element.name + ' Downloaded')
      },
      onError: (err) => {
          console.log('error', err);
      },
      onProgress: (curr, total) => {
      },
  }

  var dd = await dl(element.url, option);
  }

1 Ответ

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

Имейте в виду, что await делает что-нибудь полезное только в том случае, если вы ожидаете обещание, связанное с вашей фактической асинхронной операцией. «Связано» в этом предложении означает, что обещание разрешается, когда асинхронная операция выполняется или отклоняется, если в ней есть ошибка.

Если функция, которую вы ожидаете, либо ничего не возвращает, либо возвращает просто простое значение, но содержит асинхронные операции, то await на самом деле await ничего не делает. Он вызывает функцию, инициирует эти асинхронные операции, функция возвращает значение без обещания или возвращает уже выполненное обещание, await не имеет ничего ждать и просто продолжает выполнять больше строк кода без ожидаемой паузы для выполнения асинхронных операций.

Итак, в вашем коде единственный способ, которым:

 await adb.installApk()

выполняется перед любым из вызовов:

await files.downloadFile(element2)

если files.downloadFile() на самом деле не возвращает обещание, связанное с асинхронными операциями, которые он содержит, или, возможно, если вы никогда не выполняете files.downloadFile(element2) из-за условий.

Для получения дополнительной справки c, покажите нам код files.downloadFile() и подтвердите, что вы выполняете свои условия и выполняете их хотя бы один раз.

...