簡體   English   中英

如何從該異步函數獲得結果?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM