[英]Correct way to return a value from Node.js function
考慮以下要返回值的函數。
方法1 :
function getData() {
var myData = '';
var DateObj = new Date();
for (i=0; i<50000; i++) {
myData += "'" + DateObj.toString() +"', ";
}
return myData;
}
方法2 :
function getData(calbck) {
try{
var myData = '';
var DateObj = new Date();
for (i=0; i<50000; i++) {
myData += "'" + DateObj.toString() +"', ";
}
} catch(e){
return calbck(e,null);
}
return calbck(null, myData);
}
我已經測試了兩種方式的工作原理。 最好選擇哪一個?
謝謝
function getData1() { var myData = ''; var DateObj = new Date(); for (i=0; i<50000; i++) { myData += "'" + DateObj.toString() +"', "; } return myData; } function getData2(calbck) { try{ var myData = ''; var DateObj = new Date(); for (i=0; i<50000; i++) { myData += "'" + DateObj.toString() +"', "; } } catch(e){ return calbck(e,null); } return calbck(null, myData); } console.log('call getData1() start'); console.time('5000000-getData1()'); getData1() console.log('call getData1() End'); console.timeEnd('5000000-getData1()'); console.log('call getData2(calbck) start'); console.time('5000000-getData2(calbck)'); getData2(function(err,Returned_value){ if(err) return console.log(err); //console.log(Returned_value); console.log('call getData2(calbck) End'); console.timeEnd('5000000-getData2(calbck)'); });
輸出 :
D:\\Test>node app.js call getData1() start call getData1() End 5000000-getData1(): 91ms call getData2(calbck) start call getData2(calbck) End 5000000-getData2(calbck): 76ms D:\\Test>node app.js call getData1() start call getData1() End 5000000-getData1(): 111ms call getData2(calbck) start call getData2(calbck) End 5000000-getData2(calbck): 78ms
一切都取決於您的功能是同步還是異步。
如果您的函數是同步的,並且所有計算都立即完成,請使用第一種方法。
如果您的函數是異步的,並且它使用磁盤或網絡I / O等資源,或者最終等待任何東西,那么第二種方法實際上是唯一的選擇。
在您的示例中,該函數是同步的,因此您應該使用第一個函數。
有充分的理由使用“異步”功能簽名,即使其當前實現是同步的。 名為getData
的函數(尤其是它的實現,向我大叫“存根”)建議該函數將來可能正在執行I / O(網絡,文件系統)。 如果現在給getData
函數一個異步函數簽名,則必須使使用getData
所有代碼都傳遞一個回調。 那可能是一件好事!
稍后更改這種方法的功能簽名可能會對使用getData
所有代碼產生直接或間接的影響。
如果問題是關於假設的computeSum
函數以及給出該方法的什么方法簽名,那么我絕對建議使用同步函數簽名。 但是現在還不清楚。
通常,如果我看到它的實現將來很有可能執行I / O,即使我當前的實現沒有,我都會給我寫一個異步簽名(或讓它返回一個Promise)的任何函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.