我的解决办法是节点内的使用过程中spawn
,使用Promise
模式同步过程的执行,然后加入结果与Promise.all
(见功能promiseAll
这里:
var promiseAll = function(items, block, done, fail) {
var self = this;
var promises = [],
index = 0;
items.forEach(function(item) {
promises.push(function(item, i) {
return new Promise(function(resolve, reject) {
if (block) {
block.apply(this, [item, index, resolve, reject]);
}
});
}(item, ++index))
});
Promise.all(promises).then(function AcceptHandler(results) {
if (done) done(results);
}, function ErrorHandler(error) {
if (fail) fail(error);
});
}; //promiseAll
现在做进口
var cp = require('child_process');
和写入的执行块将产生每个进程:
var ExecutionBlock = function(item, index, resolve, reject) {
var options = [
"--ssl-protocol", "tlsv1",
"--ignore-ssl-errors", "true"
];
options.push(executableFile); // push input file path
options.push(item); // push executable arguments
// LP: now spawn the power!
var child = spawn(settings.executable, options);
// Listen for an exit event:
child.on('exit', function(exitCode) {
console.log("Child exited with code: " + exitCode);
return resolve(exitCode);
});
// Listen for stdout data
child.stdout.on('data', function(data) {
console.log(data.toString());
});
// child error
child.stderr.on('data',
function(data) {
console.log('err data: ' + data);
// on error, kill this child
child.kill();
return reject(new Error(data.toString()));
}
);
} //ExecutionBlock
在这一点上,应该在inputItemsArray
有我们的可执行文件的参数列表中,我们可以通过Promise.All
方式运行它们:
// inputItemsArray is a list of arguments for the executable
promiseAll(inputItemsArray, function(item, index, resolve, reject) {
ExecutionBlock(item, index, resolve, reject);
}
,function(results) { // aggregated results
// all execution done here. The process exitCodes will be returned
// array index is the index of the processed that exited
}
,function(error) { // error
});
建成块将汇聚一个数组中退出代码,因为我们已将它们退回resolve
。通过这种方式,您可以对执行过程进行良好的控制,在执行过程中为每个进程分配exitCode
,最终为stdout
和stderr
。
在要点here中的一个工作示例。