2

考虑以下我返回值的函数。

方法一

function getData() {
    var myData = '';
    var DateObj = new Date();
    for (i=0; i<50000; i++) {
         myData += "'" + DateObj.toString() +"', ";
    }

    return myData;
}

方法二

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 等资源,或者最终等待任何东西,那么第二种方法确实是唯一的选择。

在您的示例中,该函数是同步的,因此您应该使用第一个。

于 2013-05-23T13:09:49.367 回答
2

有充分的理由去使用“异步”函数签名,即使它当前的实现是同步的。一个名为的函数getData(尤其是它的实现,对我来说是“存根”)表明该函数将来可能会执行 I/O(网络、文件系统)。如果你现在给getData函数一个异步函数签名,你将被迫使用getData传递回调来制作所有代码。这可能是一件好事!

稍后更改此类方法的函数签名可能会对所有基于 using 的代码产生影响getData,无论是直接还是间接。

如果问题是关于一个假设computeSum函数,以及给出什么方法签名,我绝对建议使用同步函数签名。但现在,还不是很清楚。

一般来说,如果我看到它的实现很有可能在未来进行 I/O,即使它当前的实现没有,我会给我编写异步签名的任何函数(或让它返回一个承诺)。

于 2013-05-23T14:01:53.873 回答