2016-10-04 51 views
2

我写了一个函数,它产生一个进程并想将一些信息记录到控制台。功能如下:如何在node.js中产卵过程中记录信息?

function receive(count) { 
    var fileName = settings.flatfileName || "defaultFileName"; 
    for (var i = 1; i <= count; i++) { 
    var csrFileName = fileName + i + ".json"; 
    var curlProcess = spawn('/bin/sh', ['-c', curlCommand(csrFileName, caServerUrl)]); 
    curlProcess.on('close', function(code, signal) { 
     if (code !== 0) { 
     throw new Error("I'm sorry, I couldn't fetch certificate from CA. curl returned code " + code); 
     } 
     console.log("OK, I successfully fetched certificate for CSR " + csrFileName); 
    }); 
    } 
} 

的问题是,如果我调用此函数与参数2,我得到的输出看起来像这样:

OK, I successfully fetched certificate for CSR certificateRequest2.json 
OK, I successfully fetched certificate for CSR certificateRequest2.json 

因为在每次循环迭代变量csrFileName变化,它似乎在console.log中调用它的值总是等于它在循环中收到的最后一个值。是否有可能得到看起来像这样的输出?

OK, I successfully fetched certificate for CSR certificateRequest1.json 
OK, I successfully fetched certificate for CSR certificateRequest2.json 

回答

1

闭合,异动和异步!你必须多研究一下这些概念。这将解决您的问题:

function receive(count) { 
    var fileName = settings.flatfileName || "defaultFileName"; 
    for (var i = 1; i <= count; i++) { 
    (function (i) { 
     var csrFileName = fileName + i + ".json"; 
     var curlProcess = spawn('/bin/sh', ['-c', curlCommand(csrFileName, caServerUrl)]); 
     curlProcess.on('close', function (code, signal) { 
     if (code !== 0) { 
      throw new Error("I'm sorry, I couldn't fetch certificate from CA. curl returned code " + code); 
     } 
     console.log("OK, I successfully fetched certificate for CSR " + csrFileName); 
     }); 
    }(i)); 
    } 
} 
1

您可以在回路的内部分解出到一个单独的功能:

function receive(count) { 
    var fileName = settings.flatfileName || "defaultFileName"; 
    for (var i = 1; i <= count; i++) { 
    var csrFileName = fileName + i + ".json"; 
    curlFile(csrFileName); 
    } 
} 

function curlFile(csrFileName) { 
    var curlProcess = spawn('/bin/sh', ['-c', curlCommand(csrFileName, caServerUrl)]); 
    curlProcess.on('close', function(code, signal) { 
     if (code !== 0) { 
     throw new Error("I'm sorry, I couldn't fetch certificate from CA. curl returned code " + code); 
     } 
     console.log("OK, I successfully fetched certificate for CSR " + csrFileName); 
    }); 
} 
2

因为OnClose中异步,您需要将您的文件名进行绑定。

尝试这样的:

function receive(count) { 
    var fileName = settings.flatfileName || "defaultFileName"; 
    for (var i = 1; i <= count; i++) { 
    var csrFileName = fileName + i + ".json"; 
    var curlProcess = spawn('/bin/sh', ['-c', curlCommand(csrFileName, caServerUrl)]); 
    curlProcess.on('close', function(fileName, code, signal) { 
     if (code !== 0) { 
     throw new Error("I'm sorry, I couldn't fetch certificate from CA. curl returned code " + code); 
     } 
     console.log("OK, I successfully fetched certificate for CSR " + fileName); 
    }.bind(this, csrFileName)); 
    } 
} 
1

您可以使用封这样

function receive(count) { var fileName = settings.flatfileName || "defaultFileName"; 
    for (var i = 1; i <= count; i++) { 

     (function(x){ 
      var csrFileName = fileName + x + ".json"; 
      var curlProcess = spawn('/bin/sh', ['-c', curlCommand(csrFileName, caServerUrl)]); 
      curlProcess.on('close', function(code, signal) { 
        if (code !== 0) { 
         throw new Error("I'm sorry, I couldn't fetch certificate from CA. curl returned code " + code); 
       } 
       console.log("OK, I successfully fetched certificate for CSR " + csrFileName); 
      }); 
     })(i); 
    } 
}