从Node.js函数返回值的正确方法

时间:2013-05-23 08:54:05

标签: javascript node.js

考虑以下函数,我将返回一个值。

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

2 个答案:

答案 0 :(得分:3)

这一切都取决于你的功能是同步还是异步。

如果您的功能是同步的,并且所有计算都是立即完成的,请使用第一种方法。

如果您的函数是异步的,并且它使用诸如磁盘或网络I / O之类的资源,或者最终等待任何事情,那么第二种方法实际上是唯一的选择。

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

答案 1 :(得分:2)

即使当前的实现是同步的,也有充分的理由去使用“异步”函数签名。一个名为getData的函数(特别是它的实现,它向我尖叫“存根”)表明该函数将来可能正在进行I / O(网络,文件系统)。如果现在为getData函数提供异步函数签名,则必须使用getData使所有代码都通过回调。这可能是一件好事!

稍后更改此类方法的函数签名可能会导致使用getData的所有代码的分支,无论是直接还是间接。

如果问题是关于假设的computeSum函数,以及提供该函数的方法签名,我肯定建议使用同步函数签名。但现在,情况并不是那么清楚。

一般情况下,如果我看到它的实现很可能会在将来执行I / O,即使它当前的实现没有,我会给任何函数我写一个异步签名(或让它返回一个promise)