Nodejs Childexec 对文件中的每一行执行命令,但等待第一个命令退出,然后再运行下一个命令



我正在使用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();
});

});

没有测试,所以你可能需要修复拼写错误(如果有的话)。

相关内容

  • 没有找到相关文章

最新更新