我有一个加载某些页面的CasperJS进程,然后需要调用go-process来分析页面并决定接下来要加载哪个页面。 go-process需要一段时间才能执行。我的问题是CasperJS不会等待go-process完成并退出。
casper.then(function(){
var p = cp.execFile('/path/parse', [], {}, function(error, stdout, stderr) {
console.log(stdout);
});
});
我如何等待子进程完成?
答案 0 :(得分:6)
所有then*
和wait*
函数都是要执行的调度步骤。当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(){});
更简洁的方法是编写自己的包含execFile
函数的步骤函数:
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();
答案 1 :(得分:0)
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(){});
从我的测试中,capser.run
不等待execFile
完成工作。 execFile
回调没有打印日志。 @Artjom B。