2

値を返す次の関数を考えてみましょう。

方法 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
4

2 に答える 2

3

すべては、関数が同期か非同期かによって決まります。

関数が同期的で、すべての計算がすぐに行われる場合は、最初の方法を使用します。

関数が非同期で、ディスクやネットワーク I/O などのリソースを使用する場合、または何かを待機することになる場合は、実際には 2 番目の方法が唯一の選択肢です。

あなたの例では、関数は同期的であるため、最初のものを使用する必要があります。

于 2013-05-23T13:09:49.367 に答える
2

現在の実装が同期的であっても、「非同期」関数シグネチャを使用する十分な理由があります。名前が付けられた関数getData(特に、私には「スタブ」と叫ぶその実装) は、この関数が将来 I/O (ネットワーク、ファイル システム) を実行する可能性があることを示唆しています。getDataここで関数に非同期関数シグネチャを与えるとgetData、コールバックを使用してすべてのコードを作成する必要があります。そして、それは良いことかもしれません!

getDataこのようなメソッドの関数シグネチャを後で変更すると、直接的または間接的に、を使用するすべてのコードに影響を与える可能性があります。

質問が仮想computeSum関数に関するものであり、それにどのメソッド シグネチャを与えるかについてであれば、同期関数シグネチャを使用することを強くお勧めします。しかし今、それはそれほど明確ではありません。

一般に、現在の実装がそうでなくても、その実装が将来 I/O を実行する可能性が十分にあると判断した場合は、関数に非同期署名を記述します (またはプロミスを返すようにします)。

于 2013-05-23T14:01:53.873 に答える