2015-04-17 2 views
2

Я использую nodeJS, чтобы связать два вызова exec. Я хочу дождаться окончания первого, и после этого перейдем ко второму. Я использую для этого Q.nodeJS: цепочка команд 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)? Конечно, у меня нет скриншота приложения, на которое я хотел переключиться, потому что команда screencapture выполняется слишком рано.

я, хотя это был весь смысл обещаний и .then-цепочки ..

я ожидал бы, чтобы это произошло:

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

В качестве альтернативы, '.then (this.executeCommand.bind (это, 'ScreenCapture' + путь))' – Bergi