与CasperJS中的第三方异步API同步

时间:2015-06-18 10:11:17

标签: javascript promise casperjs

在这里,我感到被一些应该在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()的示例也很受欢迎,但在这种情况下,我会收到一种“常见做法”建议。

1 个答案:

答案 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;
}