Синхронизиране с асинхронен 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