nodeJS:将 exec 命令与 promise 链接起来



我正在使用nodeJS来链接两个exec调用。我想等待第一个完成,然后继续第二个。我为此使用 Q。

我的实现如下所示:

我有一个执行命令函数:

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: 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)的执行完成?当然,我没有得到要切换到的应用程序的屏幕截图,因为屏幕捕获命令执行得太早了。

我认为这就是承诺和链接的全部意义。

我本来希望这种情况发生:

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

这就是你的问题:

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));

相关内容

  • 没有找到相关文章

最新更新