考虑以下函数,我将返回一个值。
方法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
答案 0 :(得分:3)
这一切都取决于你的功能是同步还是异步。
如果您的功能是同步的,并且所有计算都是立即完成的,请使用第一种方法。
如果您的函数是异步的,并且它使用诸如磁盘或网络I / O之类的资源,或者最终等待任何事情,那么第二种方法实际上是唯一的选择。
在您的示例中,该函数是同步的,因此您应该使用第一个函数。
答案 1 :(得分:2)
即使当前的实现是同步的,也有充分的理由去使用“异步”函数签名。一个名为getData
的函数(特别是它的实现,它向我尖叫“存根”)表明该函数将来可能正在进行I / O(网络,文件系统)。如果现在为getData
函数提供异步函数签名,则必须使用getData
使所有代码都通过回调。这可能是一件好事!
稍后更改此类方法的函数签名可能会导致使用getData
的所有代码的分支,无论是直接还是间接。
如果问题是关于假设的computeSum
函数,以及提供该函数的方法签名,我肯定建议使用同步函数签名。但现在,情况并不是那么清楚。
一般情况下,如果我看到它的实现很可能会在将来执行I / O,即使它当前的实现没有,我会给任何函数我写一个异步签名(或让它返回一个promise)