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是的,但我不知道如何正确地执行它,我编辑了代码,您能看一下吗?谢谢,我刚刚尝试过,它按预期工作!谢谢你,我刚试过,效果如预期!谢谢你的解释,我想我现在明白了。我也想用承诺来做这件事,但我不明白他们是怎么工作的,现在我想我明白了,我想我现在明白了。我也想用承诺来实现这一点,但我不明白它们是如何工作的,现在对我来说更清楚了