[英]How do I get the result from this async function?
我正在尝试从diskName
this.getDiskName('C:')
获取diskName
值,并将其分配给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
})
...
}
有人可以解释如何正确返回值吗?
您的问题是您缺少进入getDiskName()
的回调或出现的Promise()
。
由于Promise
方法在当今似乎更受欢迎,因此我将继续回答这个问题。
使用Promise
方法,您需要该函数返回Promise
。 在大多数情况下,您只需将所有代码包装在Promise
并返回:
getDiskName(diskLetter) {
return new Promise((resolve, reject) => {
// rest of your code in the function
});
}
然后,您将调用resolve()
而不是return
:
let diskName = stdout.split('\n')[1];
resolve(diskName)
对于您的错误,您将调用拒绝:
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);
})
}
}
现在,这可能仍然对您不起作用,因为在调用之后您可能需要依靠知道diskName的代码。 在这种情况下,您可能会将代码滚动到匿名函数中。 也许getDisksInfo
取一个函数作为参数。
这是一般模式,您必须确定它最适合您的程序的方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.