【问题标题】:NodeJs async/await againNodeJs 再次异步/等待
【发布时间】:2020-04-26 02:21:59
【问题描述】:

我只是无法理解这些东西:(

    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的内容,我想我需要把它包装在一个promise中?

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);
  }

【问题讨论】:

  • files.downloadFile 返回什么?你确认这是一个承诺吗?

标签: javascript node.js async-await


【解决方案1】:

请记住,await 只有在您等待与您的实际异步操作相关联的承诺时才会做任何有用的事情。那句话中的“链接”意味着当异步操作完成时承诺解决,或者如果有错误则拒绝。

如果您正在等待的函数不返回任何内容或只返回一个普通值,但包含异步操作,则 await 实际上不会 await 任何内容。它调用该函数,启动那些异步操作,该函数返回一个非承诺值或返回一个已解决的承诺,await 没有任何等待,只是继续执行更多行代码而没有预期的暂停完成异步操作。

因此,在您的代码中,唯一的方法是:

 await adb.installApk()

在任何调用之前执行:

await files.downloadFile(element2)

如果files.downloadFile() 实际上没有返回一个链接到它包含的异步操作的promise,或者你可能因为条件而从不执行files.downloadFile(element2)

如需更具体的帮助,请向我们展示files.downloadFile() 的代码,并确认您已通过条件并至少执行一次。

【讨论】:

    猜你喜欢
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 2018-02-08
    • 2020-03-31
    • 2019-06-30
    • 2019-08-08
    相关资源
    最近更新 更多