Синхронизация со сторонним асинхронным API в 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(), также приветствуются, но в этом случае я получу своего рода предложение «общей практики».


person vdudouyt    schedule 18.06.2015    source источник


Ответы (1)


Вы должны дождаться завершения дочернего процесса. Обычно это делается с помощью (глобальной) переменной. Он устанавливается в случае «выхода» дочернего процесса, и последующий 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(). Подробнее см. мой ответ здесь.

Вместо casper.waitFor() вы можете использовать бесконечное ожидание:

casper.infWaitFor = function(check, then) {
    this.waitFor(check, then, function onTimeout(){
        this.infWaitFor(check, then);
    });
    return this;
}
person Artjom B.    schedule 18.06.2015