2015-03-25 85 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.