簡體   English   中英

從Node.js函數返回值的正確方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM