Nodejs Childexec 为文件中的每一行执行命令,但在 运行 下一个命令之前等待第一个命令退出

Nodejs Childexec execute command for each line in file but wait for the first command to exit before running the next

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

});

没有测试,所以如果有错别字,您可能需要更正。