Javascript 等待CasperJS中的子进程

Javascript 等待CasperJS中的子进程,javascript,phantomjs,casperjs,Javascript,Phantomjs,Casperjs,我有一个CasperJS进程加载一些页面,然后它需要调用一个go进程来分析页面并决定下一步应该加载哪个页面。执行go过程需要一段时间。我的问题是CasperJS不会等待go进程完成并退出 casper.then(function(){ var p = cp.execFile('/path/parse', [], {}, function(error, stdout, stderr) { console.log(stdout); }); }); 如何等待子进程完成?所有然后*和

我有一个CasperJS进程加载一些页面,然后它需要调用一个go进程来分析页面并决定下一步应该加载哪个页面。执行go过程需要一段时间。我的问题是CasperJS不会等待go进程完成并退出

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

});

如何等待子进程完成?

所有
然后*
等待*
函数都是要执行的调度步骤。当CasperJS执行的步骤不足,并且没有函数被传递到
casper.run()
,那么它将自动退出

简单的解决方法是始终将空函数传递到
casper.run()
,并从函数内部安排新步骤:

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(){});
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();
一种更简洁的方法是编写自己的step函数,该函数封装了
execFile
函数:

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(){});
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();
根据我的测试,
capser.run
不会等待
execFile
完成作业。没有从
execFile
回调打印日志@阿特乔姆B