Par*_*osh 8 javascript node.js
我在请求中得到了一个字符串数组.每个字符串都包含要在本机shell上执行的命令.
var process = require('child_process');
function execCommand(req,res,callback){
var params = req.params.list //list is an array in the request
var result = '';
var command = '';
for (var i = 0; i < params.length; i++) {
command = params[i];
cmd = process.exec(command);
cmd.stdout.on('data', function(data){
//push the shell output in variable result
});
cmd.on('close', function(code) {
//convert the variable result to a valid JSON
});
}
res.send(result);
};
Run Code Online (Sandbox Code Playgroud)
所有命令的结果在result变量中混淆.如何使for循环中的函数调用同步?
使用execSync而不是exec!
for (var i = 0; i < params.length; i++) {
command = params[i];
result += process.execSync(command).toString();
}
Run Code Online (Sandbox Code Playgroud)
正如其他人所指出的那样,这可能不是一个好主意,因为它会阻止事件循环和正在进行的任何请求.如果正在执行的过程将花费很短的时间来完成,这是可以接受的,但不是这样.
这是一个简单的模式来控制for循环中的异步函数流...每次进程返回时,params_finished递增1.一旦完成的进程数等于响应发送的进程总数.
for (var i = 0, total_params=params.length, params_finished=0; i < total_params; i++) {
command = params[i];
cmd = process.exec(command);
cmd.stdout.on('data', function(data){
//push the shell output in variable result
});
cmd.on('close', function(code) {
//convert the variable result to a valid JSON
params_finished++
if(params_finished == total_params){
res.send(result);
}
});
}
Run Code Online (Sandbox Code Playgroud)
您可以使用execSync或...
您需要添加一个控制流库来帮助异步调用,以便您可以选择串行或并行运行您的函数:
Q.nfcall) https://www.npmjs.com/package/q| 归档时间: |
|
| 查看次数: |
7863 次 |
| 最近记录: |