2011-12-29 97 views
0

我讀過並且聽說我不應該在函數中返回值,因爲它是一個阻塞操作,並且它可能會拒絕任何請求,直到操作完成。node.js中的回調

所以這裏是一個我編碼的小函數,我想知道如果我正確處理它。我這樣說是因爲我剛開始使用節點,而且我想以正確的方式進行編碼,這也是因爲在函數內部有一個測試條件而另一個測試回調的感覺很奇怪。

function isWithinSplit(path, target, separator, callBack) 
{ 
var response = ""; 
var readStream = fs.createReadStream(path); 

readStream.on('data', function (data) { 
    response += data; 
}); 

//Data complete, process it 
readStream.on('end', function (close) 
{ 
    var array = response.split(separator); 

    for (var idx=0 ; idx < array.length; idx++) 
    { 
     if(array[idx] != "" && array[idx] == target) 
      callBack("true"); 
     else 
      callBack("false"); 
    } 
}); 

} 

電話:

fileHelper.isWithinSplit(__dirname + ROOM_LIST_PATH, "hello", "|", function(data){ 
    if(data == "true") 
    console.log("hurray!"); 
}); 

我只是想知道這是否是人們如何做,如果它是有效的。

回答

3

你忘

  • 錯誤處理
  • 使用===
  • 緩存陣列長度
  • 命名匿名函數
function isWithinSplit(path, target, separator, callBack) { 
    var response = ""; 
    var readStream = fs.createReadStream(path); 

    readStream.on('data', function _aggregateData(data) { 
     response += data; 
    }); 

    //Data complete, process it 
    readStream.on('end', function _findTarget(close) { 
     var array = response.split(separator); 

     for (var idx = 0, len = array.length; idx < len; idx++) { 
      if (array[idx] === target) { 
       return callBack(null, true); 
      } 
     } 
     callback(null, false); 
    }); 

    readStream.on('error', callBack); 
} 

fileHelper.isWithinSplit(__dirname + ROOM_LIST_PATH, "hello", "|", printIfSuccess); 

function printIfSuccess(err, data) { 
    if (data === true) { 
     console.log("hurray!"); 
    } 
} 

你可以也改善它使用Array.prototype.any

readStream.on('end', function(close) { 
    callback(null, response.split(seperator).any(function _doesItMatchTarget(val) { 
     return val === target; 
    })); 
}); 
+0

謝謝,我會調整我的代碼,並學習你的良好做法。 – 2011-12-29 21:05:55