Javascript 从Node.js函数返回值的正确方法
考虑以下返回值的函数 方法1:Javascript 从Node.js函数返回值的正确方法,javascript,node.js,Javascript,Node.js,考虑以下返回值的函数 方法1: 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
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);
}
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
的函数(尤其是它的实现,它向我尖叫“stub”)表明这个函数将来可能会执行I/O(网络、文件系统)。如果现在给getData
函数一个异步函数签名,则必须使用getData
传递回调。这也许是件好事
稍后更改此类方法的函数签名可能会对使用getData
的所有代码产生影响,无论是直接还是间接
如果问题是关于一个假设的computeSum
函数,以及给出该函数的方法签名,我绝对建议使用同步函数签名。但现在,还不太清楚
一般来说,如果我看到它的实现很有可能在将来执行I/O,即使它当前的实现没有,我会给我写一个异步签名(或让它返回一个承诺)的任何函数。First是最好的IMO,因为它更简单。在这个例子中没有理由使用回调,因为你的函数不是异步的。用测试代码更新了这个问题基于性能测试这个问题真的没有意义。不同之处(正如@robertklep所提到的)是,后一个带有回调的函数用于异步执行,例如在等待某个IO操作完成时。不过,这是一个人为设计的示例,不用于对同步执行和异步执行进行基准测试。
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