2015-04-17 82 views
2

我使用nodeJS爲了鏈接兩個exec調用。我想等待第一個完成,然後繼續第二個。我正在使用QnodeJS:用承諾鏈接exec命令

我的實現看起來是這樣的:

我有一個executeCommand功能:

executeCommand: function(command) { 
    console.log(command); 
    var defer = Q.defer(); 
    var exec = require('child_process').exec; 

     exec(command, null, function(error, stdout, stderr) { 
      console.log('ready ' + command); 
      return error 
       ? defer.reject(stderr + new Error(error.stack || error)) 
       : defer.resolve(stdout); 
     }) 

     return defer.promise; 
} 

並有captureScreenshot函數鏈中的前一兩個電話。

captureScreenshot: function(app_name, path) { 
     return this.executeCommand('open -a ' + app_name) 
      .then(this.executeCommand('screencapture ' + path)); 
} 

當我執行captureScreenshot( '昇華',」 ./sublime.png)日誌輸出如下:

open -a sublime 
screencapture ./sublime.png 
ready with open -a sublime 
ready with screencapture ./sublime.png 

有人可以解釋爲什麼第二命令的執行(抓屏)不等待,直到第一個命令(打開 - 昇華)完成的執行?當然,我沒有得到我想切換到的應用程序的屏幕截圖,因爲screencapture命令執行得太早。

不過,我覺得這是承諾和。然後,鏈接整點..

我本來期望這種情況發生:

open -a sublime 
ready with open -a sublime 
screencapture ./sublime.png 
ready with screencapture ./sublime.png 

回答

3

潛藏您的問題:

return this.executeCommand('open -a ' + app_name) 
    .then(this.executeCommand('screencapture ' + path)); 

你基本上已經執行了this.executeCommand('sreencapture'...),事實上,當前面的承諾解決時,你實際上是想推遲它的執行。

嘗試改寫它作爲這樣:

return this.executeCommand('open -a ' + app_name) 
    .then((function() { 
     return this.executeCommand('screencapture ' + path);  
    }).bind(this)); 
+2

另外'。然後(this.executeCommand.bind(此, '抓屏' +路徑))' – Bergi