Wait for a child process in CasperJS

我的梦境 提交于 2019-11-28 08:28:49

问题


I have a CasperJS process that loads some page and then it needs to call a go-process to analyze the page and to decide what page should be loaded next. go-process takes a while to execute. My problem is that CasperJS doesn't wait for the go-process to complete and exits.

casper.then(function(){
  var p = cp.execFile('/path/parse', [], {}, function(error, stdout, stderr) {
    console.log(stdout);
  });

});

How can I wait for my child process to complete?


回答1:


All then* and wait* functions are scheduling steps to be executed. When CasperJS runs out of steps to execute and no function is passed into casper.run(), then it will automatically exit.

The easy fix would be to always pass an empty function into casper.run() and schedule new steps from inside the function:

casper.then(function(){
  var p = cp.execFile('/path/parse', [], {}, function(error, stdout, stderr) {
    console.log(stdout);
    casper.thenOpen(parsedUrl).then(function(){
      // do something on page
    });
  });
});
casper.run(function(){});

A more clean approach would be to write your own step function that wraps the execFile function:

casper.waitForFileExec = function(process, callback, onTimeout, timeout){
    this.then(function(){
        var cp = require('child_process'),
            finished = false,
            self = this;
        timeout = timeout === null || this.options.stepTimeout;
        cp.execFile(process, [], {}, function(error, stdout, stderr) {
            finished = true;
            callback.call(self, error, stdout, stderr);
        });
        this.waitFor(function check(){
            return finished;
        }, null, onTimeout, timeout);
    });
    return this; // for builder/promise pattern
};

...
casper.waitForFileExec('/path/parse', function(error, stdout, stderr) {
    this.echo(stdout);
    this.thenOpen(parsedUrl).then(function(){
        // do something on page
    });
}).run();



回答2:


casper.then(function(){
  var p = cp.execFile('/path/parse', [], {}, function(error, stdout, stderr) {
    console.log(stdout);
    casper.thenOpen(parsedUrl).then(function(){
      // do something on page
    });
  });
});
casper.run(function(){});

From my test, capser.run does not wait for execFile to finish the job. There is no log gets printed from the execFile callback. @Artjom B.



来源:https://stackoverflow.com/questions/29253690/wait-for-a-child-process-in-casperjs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!