2016-10-04 49 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); 
    } 
}