使函数调用for循环同步

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循环中的函数调用同步?

Chr*_*eid 5

使用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)


Tho*_*och 2

您可以使用execSync或...

您需要添加一个控制流库来帮助异步调用,以便您可以选择串行或并行运行您的函数: