Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从Node.js函数返回值的正确方法_Javascript_Node.js - Fatal编程技术网

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

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

考虑以下返回值的函数

方法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 = '';
    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