我正在使用nodejs与我制作的casperjs脚本进行通信。首先,我将告诉您我的Casperjs脚本是做什么的。我已经使用命令行输入设置了它。我运行此命令
casperjs script.js "Inputdata1" "inputdata2"
然后,此脚本执行并访问我的一个服务器,提交输入数据 1 和 2。
然后等待服务器响应,并为 10 个文本文件之一授予一行权限根据脚本从我的服务器获得的结果
这个 Casperjs 脚本工作正常,没有问题。
现在我正在构建一个 NodeJS 脚本来一遍又一遍地运行 Casperjs 脚本
我的nodejs脚本假设使用readline读取文本文件.js然后对于每一行使用其中的数据执行Casperjs命令。
问题是我的脚本一次执行所有执行,并且我在 Casperjs 的文本文件中没有得到任何结果
我需要我的 nodejs 脚本来执行第一行等待 Casperjs 退出然后,然后才转到下一行并使用 Casperjs 执行它
而且我需要实际的 Casperjs 脚本照常工作
这是我的 NodeJS 脚本 - 我已经尝试了几天不同的代码不同模块,但无法解决它,因此非常感谢任何帮助
var fs = require('fs'),
sleep = require('sleep'),
readline = require('readline');
var rd = readline.createInterface({
input: fs.createReadStream('file.txt'),
output: process.stdout,
terminal: false
});
rd.on('line', function(line) {
var exec = require('child_process').exec;
var child = exec('casperjs check.js ' + line );
child.on('close', function(code) {
console.log('closing code: ' + code);
});
});
您正在寻找顺序循环。也就是说,在上一步完成后执行下一步。
困难来了,因为 Node.js 是异步的,并且开箱即用的顺序功能很少。
有两种选择。
递归回调
var fs = require('fs'),
sleep = require('sleep'),
exec = require('child_process').exec,
readline = require('readline');
var rd = readline.createInterface({
input: fs.createReadStream('file.txt'),
output: process.stdout,
terminal: false
});
var lines = [];
rd.on('line', function(line) {
lines.push(line);
});
rd.on('end', function() {
var i=0;
if(i < lines.length) {
exec('casperjs check.js ' + lines[i], function execCallback(code) {
console.log('closing code: ' + code);
i++;
if(i < lines.length) exec('casperjs check.js ' + lines[i], execCallback);
});
}
});
具有顺序支持的异步库
有很多选项,例如,让我们看看异步。
var fs = require('fs'),
sleep = require('sleep'),
exec = require('child_process').exec,
async = require('async'),
readline = require('readline');
var rd = readline.createInterface({
input: fs.createReadStream('file.txt'),
output: process.stdout,
terminal: false
});
var q = async.queue(function (task, callback) {
var child = exec('casperjs check.js ' + task.line );
child.on('close', function(code) {
callback(code);
});
}, 1);
rd.on('line', function(line) {
q.push({line: line}, function (code) {
console.log('closing code: ' + code + line);
JSON.stringify();
});
});
没有测试,所以你可能需要修复拼写错误(如果有的话)。