2015-03-25 123 views
3

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

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

}); 

我该如何等待我的子进程完成?

回答

4

全部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(); 
+0

这个答案应该是一个可以接受的答案。 – 2016-10-23 00:03:58

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.