我正在使用nodeJS来链接两个exec调用。我想等第一个完成,然后继续第二个。我正在使用Q。
我的实现如下:
我有一个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',' ./ sublime.png)时,日志记录输出如下:
open -a sublime
screencapture ./sublime.png
ready with open -a sublime
ready with screencapture ./sublime.png
有人可以解释为什么在完成第一个命令(open -a sublime)的执行之前不会等待执行第二个命令(screencapture)吗?当然,我没有获得我想切换到的应用程序的屏幕截图,因为screencapture命令执行得太早。
我虽然这是承诺和.then-chaining的全部要点......
我原本预计会发生这种情况:
open -a sublime
ready with open -a sublime
screencapture ./sublime.png
ready with screencapture ./sublime.png
答案 0 :(得分: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));