如何从此异步函数中获取结果?

时间:2018-05-29 12:18:33

标签: javascript

问题

我正在尝试从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
      })
    ...
}

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

def compare(a,b,c):
    if a - 3 == 8:
        return "I like a!"
    elif b == c:
        return "I like c!"
    else:
        return "I like b!"

问题

有人可以解释一下如何正确返回值吗?

2 个答案:

答案 0 :(得分:1)

您的问题是,您错过了getDiskName()Promise()即将发出的回调。

由于Promise方法现在似乎更受欢迎,我会继续这样做以获得这个答案。

使用Promise方法,您需要函数返回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)

对于你的错误,你会打电话给拒绝:

if (err) {
  reject(err);
}

然后,在使用它的函数中,您必须等待函数中的then()

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

回调方法类似,您只需将回调传递到getDiskName并在准备好后调用它。

答案 1 :(得分:1)

这是处理这种情况的更惯用的方法。我们将函数传递给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);
    })
  }
}

现在,这仍然可能对您不起作用,因为您可能在调用后依赖于知道diskName的代码。在这种情况下,您可能会将该代码转换为您的匿名函数。也许getDisksInfo将函数作为参数来代替。

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