gpt4 book ai didi

javascript - Node : chaining exec commands with promises

转载 作者:搜寻专家 更新时间:2023-11-01 00:42:35 24 4
gpt4 key购买 nike

我正在使用 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 命令执行得太早了。

我认为这就是 promise 和.then-chaining..

我预料到会发生这种情况:

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'...),而实际上,您实际上想在先前的 promise 解决时推迟它的执行。

尝试重写它:

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

关于javascript - Node : chaining exec commands with promises,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29699058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com