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

标签 node.js wait exit readline child-process

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

});

未测试,因此您可能需要修复拼写错误(如果有)。

关于node.js - Nodejs Childexec 对文件中的每一行执行命令,但等待第一个命令退出,然后再运行下一个命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28022770/

相关文章:

node.js - 是否可以使用 ref-struct 和 ref-array 创建结构数组?

c# - 等待用户输入 C# 控制台应用程序的设置时间

c++ - qt 等待信号/事件,GUI

node.js - 描述一下 Node.js 中的退出代码?

javascript - 如何将一个可读流传输到另一个可读流?

mysql - 日期范围之间的 Sequelize 始终返回今天的日期而不是记录中的日期

javascript - Nodejs 从字符串执行导出的函数

javascript - 在 javascript 中制作自定义确认框

C# 进程终止通知

c# - 从 C# 中的控制台应用程序退出