Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从这个异步函数中获得结果? 问题_Javascript - Fatal编程技术网

Javascript 如何从这个异步函数中获得结果? 问题

Javascript 如何从这个异步函数中获得结果? 问题,javascript,Javascript,我正试图从this.getDiskName('C:')中获取diskName值 并将其分配给元素['name']: getDisksInfo () { ... element['name'] = this.getDiskName('C:') ... }, getDiskName (diskLetter) { if (process.platform == 'win32') { var exec = require('child_process').exec v

我正试图从
this.getDiskName('C:')中获取
diskName
并将其分配给
元素['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
      })
    ...
}
问题:
有人能解释一下如何正确返回值吗?

您的问题是,您缺少进入
getDiskName()
的回调或出来的
Promise()

既然
Promise
方法现在似乎更受欢迎,我就用它来回答这个问题

使用
Promise
方法,需要函数返回
Promise
。在大多数情况下,您只需将所有代码包装在一个
Promise
中,然后返回:

getDiskName(diskLetter) {
    return new Promise((resolve, reject) => {
      // rest of your code in the function
    });
}
然后,您将调用
resolve()
,而不是返回

对于您的错误,您将调用拒绝:

if (err) {
  reject(err);
}
然后,在使用它的函数中,您必须等待函数中的
Then()

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

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

您的问题是缺少进入
getDiskName()
的回调,或者缺少出来的
Promise()

既然
Promise
方法现在似乎更受欢迎,我就用它来回答这个问题

使用
Promise
方法,需要函数返回
Promise
。在大多数情况下,您只需将所有代码包装在一个
Promise
中,然后返回:

getDiskName(diskLetter) {
    return new Promise((resolve, reject) => {
      // rest of your code in the function
    });
}
然后,您将调用
resolve()
,而不是返回

对于您的错误,您将调用拒绝:

if (err) {
  reject(err);
}
然后,在使用它的函数中,您必须等待函数中的
Then()

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

回调方法与此类似,您只需将回调传递到
getDiskName
中,并在准备就绪时调用它。

这是处理此类情况的更惯用方法。我们将传递一个函数到
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
将函数作为参数


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

这是一种更惯用的方法来处理这样的情况。我们将传递一个函数到
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
将函数作为参数


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

可能重复@CodeF0x,我无法将其他答案改编为该代码。我总是收到一个错误,说回调没有定义。你能给我一个提示吗?你不能退货。您需要在此处设置值,而不是
返回diskName
。我将用一种更惯用的方式创建一个答案。您是否向它传递了一个回调以便定义它?@epascarello是的,但我不知道如何正确地执行它,我编辑了代码,您能看一下吗?@codefox的可能重复我无法将其他答案改编到此代码。我总是收到一个错误,说回调没有定义。你能给我一个提示吗?你不能退货。您需要在此处设置值,而不是
返回diskName
。我将用一种更惯用的方式创建一个答案。您是否向它传递了一个回调以便定义它?@epascarello是的,但我不知道如何正确地执行它,我编辑了代码,您能看一下吗?谢谢,我刚刚尝试过,它按预期工作!谢谢你,我刚试过,效果如预期!谢谢你的解释,我想我现在明白了。我也想用承诺来做这件事,但我不明白他们是怎么工作的,现在我想我明白了,我想我现在明白了。我也想用承诺来实现这一点,但我不明白它们是如何工作的,现在对我来说更清楚了