2017-06-22 34 views
0

我有一個非常乾淨簡單的方法,使用Node V8 Promisfy()和異步函數執行「await runJob()」。我遇到的問題是我需要處理childProcess.execFile()返回的子對象。所以現在我有一個非常混亂的解決方案,但是我顯然不滿意它。任何想法如何清理?簡化節點V8 childprocess.exec

前:

const invoke = util.promisify(childProcess.execFile) 

async runJob() { 
    try { 
     const std = await invoke(this.FMEPath, ["PARAMETER_FILE", this.fmeParamFile], { cwd: this.root }) 
     this.stderr = std.stderr 
     this.stdout = std.stdout 
    } catch (err) { 
     this.errors++ 
     logger.addLog('error', "FMEjob.runJob - childProcess.execFile failed: %s", err.message, { paramFile: this.fmeParamFile, error: err }) 
    } 
} 

後:

async runJob() { 
    return new Promise((resolve, reject) => { 
     this.child = execFile(this.FMEPath, 
      ["PARAMETER_FILE", this.fmeParamFile], 
      { cwd: this.root }, 
      (err, stdout) => { 
       if (err) { 
        this.errors++ 
        logger.addLog('error', "FMEjob.runJob - childProcess.execFile failed: %s", err.message, { paramFile: this.fmeParamFile, error: err }) 
        return reject(false) 
       } else { 
        this.stderr = stderr 
        this.stdout = stdout 
        resolve(true) 
       } 
      }) 
    }) 
} 

回答

3

只放回調,並沒有別的內部resolve/reject

async runJob() { 
    try { 
     const std = await new Promise((resolve, reject) => { 
      this.child = execFile(this.FMEPath, ["PARAMETER_FILE", this.fmeParamFile], { cwd: this.root }, (err, std) => { 
       if (err) reject(err); 
       else resolve(std); 
      }); 
     }); 
     this.stderr = std.stderr 
     this.stdout = std.stdout 
     return true; 
    } catch (err) { 
     this.errors++ 
     logger.addLog('error', "FMEjob.runJob - childProcess.execFile failed: %s", err.message, { paramFile: this.fmeParamFile, error: err }) 
     throw false; 
    } 
} 
+0

不會通話常量運行ning =等待this.runJob()馬上得到真值。我擁有它的方式是runJob()返回一個承諾。這改變了這一點。 –

+0

不,'runJob' - 一個'async'函數 - 仍然會返回一個承諾。這就是爲什麼你必須「等待」它,並在稍後得到「真」。 – Bergi