代码之家  ›  专栏  ›  技术社区  ›  Un1

如何从这个异步函数获得结果?

  •  0
  • Un1  · 技术社区  · 6 年前

    问题

    我正试图得到 diskName 值返回自 this.getDiskName('C:') 并分配给 element['name'] :

    getDisksInfo () { 
      ...
      element['name'] = this.getDiskName('C:')
      ...
    },
    
    getDiskName (diskLetter) {
      if (process.platform == 'win32') {
        var exec = require('child_process').exec
        var cmd = `wmic logicaldisk where caption="${diskLetter}" get VolumeName`
    
        exec(cmd, (err, stdout, stderr) => {
          if (err) {
            console.log(err)
          }
          let diskName = stdout.split('\n')[1]
          return diskName
        })
      }
    }
    

    我试过这样做,但我一直有不同的错误:

    getDiskName (diskLetter, callback) {
        ...
        exec(cmd, (err, stdout, stderr) => {
          if callback(null, () => {
            let diskName = stdout.split('\n')[1]
            return diskName
          })
        ...
    }
    

    问题

    有人能解释一下如何正确地返回这个值吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   samanime    6 年前

    你的问题是你错过了一个回调 getDiskName() 或A Promise() 出来。

    自从 Promise 现在这种方法似乎更受欢迎,我就用它来回答这个问题。

    用一个 承诺 方法,您需要函数返回 承诺 . 在大多数情况下,您只需将所有代码包装在 承诺 并返回:

    getDiskName(diskLetter) {
        return new Promise((resolve, reject) => {
          // rest of your code in the function
        });
    }
    

    那么,而不是你的 return ,你会打电话给 resolve() :

    let diskName = stdout.split('\n')[1];
    resolve(diskName)
    

    对于您的错误,您将调用reject:

    if (err) {
      reject(err);
    }
    

    然后,在使用它的函数中,您必须等待 then() 在您的职能范围内:

    this.getDiskName('C:').then(diskName => console.log(diskName))
    

    getDiskName 准备好了就叫它。

        2
  •  1
  •   Michael Chaney    6 年前

    这是处理这种情况的更惯用的方法。我们将向传递函数 getDiskName 它以磁盘名(返回值)作为参数。

    getDisksInfo () { 
      ...
      this.getDiskName('C:', function(diskName) {
        element['name'] = diskName;
      });
      // Note that code from here to the end doesn't have access
      // to element['name']
      ...
    },
    
    getDiskName (diskLetter, func) {
      if (process.platform == 'win32') {
        var exec = require('child_process').exec
        var cmd = `wmic logicaldisk where caption="${diskLetter}" get VolumeName`
    
        exec(cmd, (err, stdout, stderr) => {
          if (err) {
            console.log(err)
          }
          let diskName = stdout.split('\n')[1]
          func(diskName);
        })
      }
    }
    

    现在,这仍然可能对您不起作用,因为调用后可能有代码,而代码依赖于知道磁盘名。在这种情况下,您可能会将代码转入匿名函数。也许 getDisksInfo 将函数作为参数。

    这是一般模式,您必须确定它如何最适合您的程序。