在这里,我感到被一些应该在casper.then()
回调中运行的异步代码所困扰。
casper.then(function() {
var spawn = require("child_process").spawn;
var child = spawn("somecommand", ["somearg"]);
child.stdout.on("data", function (data) {
console.log("spawnSTDOUT:", JSON.stringify(data))
});
});
casper.then(function () {
// Something that should be synchonized
});
有没有办法确保只有在数据回调启动后才会执行第二个then()
?
我希望在默认执行后将第一个then()
替换为不会将控件传递给第二个then()
的东西,而是宁愿通过调用某些内容来执行此操作(让我们称之为'解析' “正如承诺模式所暗示的那样”在数据回调中。
使用casper.waitFor()
的示例也很受欢迎,但在这种情况下,我会收到一种“常见做法”建议。
答案 0 :(得分:0)
您必须等到子进程退出。这通常使用(全局)变量来完成。它是在子进程“退出”的情况下设置的,随后的casper.waitFor()
将等到该变量真实。您可能需要调整超时。
casper.then(function() {
var spawn = require("child_process").spawn;
var child = spawn("somecommand", ["somearg"]);
child.stdout.on("data", function (data) {
console.log("spawnSTDOUT:", JSON.stringify(data))
});
var childHasExited = false;
child.on("exit", function (code) {
childHasExited = true;
})
this.waitFor(function check(){
return childHasExited;
}, null, null, 12345); // TODO: adjust the timeout
});
casper.then(function () {
// Something that should be synchonized
});
CasperJS的脚本并不是基于承诺,这就是必须使用waitFor()
的原因。请参阅我的回答here了解更多信息。
而不是casper.waitFor()
你可以使用无限的waitFor:
casper.infWaitFor = function(check, then) {
this.waitFor(check, then, function onTimeout(){
this.infWaitFor(check, then);
});
return this;
}