[英]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.