Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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
Node.js 阻塞代码总是使用返回语句,而非阻塞代码总是使用回调吗?_Node.js_Nonblocking - Fatal编程技术网

Node.js 阻塞代码总是使用返回语句,而非阻塞代码总是使用回调吗?

Node.js 阻塞代码总是使用返回语句,而非阻塞代码总是使用回调吗?,node.js,nonblocking,Node.js,Nonblocking,在初学者教程中,节点的非阻塞性质通常通过显示阻塞示例(使用return语句)和非阻塞节点示例(使用回调)来演示。有关示例,请参见 我是否应该将使用return在我的节点应用程序中创建阻塞代码视为一种“气味”,并找到一种使用回调重做代码的方法?TL;DR:如果代码可能需要“很长”的时间,那么通过回调处理代码可能会更干净/更高效 这不是关于返回/不返回,而是关于代码实际执行的操作 示例函数不会因为返回而阻塞,而是因为db而阻塞。query需要任意时间。如果您想在此期间执行其他操作,请立即返回,并在回

在初学者教程中,节点的非阻塞性质通常通过显示阻塞示例(使用
return
语句)和非阻塞节点示例(使用回调)来演示。有关示例,请参见

我是否应该将使用
return
在我的节点应用程序中创建阻塞代码视为一种“气味”,并找到一种使用回调重做代码的方法?

TL;DR:如果代码可能需要“很长”的时间,那么通过回调处理代码可能会更干净/更高效

这不是关于返回/不返回,而是关于代码实际执行的操作

示例函数不会因为返回而阻塞,而是因为
db而阻塞。query
需要任意时间。如果您想在此期间执行其他操作,请立即返回,并在回调中执行结果处理

您是否应该取决于实际发生的情况,还有什么可能会受到或取决于传递给回调(或返回)的数据的影响,等等。

TL;DR:如果代码可能需要“很长”的时间,那么通过回调处理代码可能会更干净/更高效

这不是关于返回/不返回,而是关于代码实际执行的操作

示例函数不会因为返回而阻塞,而是因为
db而阻塞。query
需要任意时间。如果您想在此期间执行其他操作,请立即返回,并在回调中执行结果处理


您是否应该取决于实际发生的情况,还有什么可能会受到传递到回调(或返回)的数据的影响,或者取决于这些数据,等等。

阻塞调用通常会返回一些内容,因为返回发生在调用引起的“操作”之后,因此,它可以返回有关操作成功或失败的信息,以及操作生成的任何数据。这也适用于本身不阻塞但不执行i/o的调用,因此不需要回调


非阻塞调用,例如对读取文件的函数的调用,不倾向于使用返回值,因为它们通常在执行任何重要操作之前返回。相反,它们调用回调并发送生成的任何数据或可能的错误消息。

阻塞调用通常会返回某些信息,因为返回发生在调用导致的“操作”之后,因此它可以返回有关操作成功或失败的信息,以及操作生成的任何数据。这也适用于本身不阻塞但不执行i/o的调用,因此不需要回调


非阻塞调用,例如对读取文件的函数的调用,不倾向于使用返回值,因为它们通常在执行任何重要操作之前返回。相反,它们调用回调并发送生成的任何数据或可能的错误消息。

使用非阻塞调用的主要动机是,您正在等待某个外部进程或设备返回,因此您可以释放对线程的控制,以允许其他操作“在等待时”运行

因为使用回调的非阻塞/异步代码更难编写、读取和维护,所以您应该避免使用非阻塞代码,除非它会影响应用程序的性能和可伸缩性,或者您正在使用的API需要非阻塞代码

考虑一下这个相对愚蠢的例子:

  function add(a,b,cb) { cb(a+b); }
  console.log('2+2 is', add(2,2)); // -> 4

  function add(a,b) { return a+b; }
  add(2,2,function(sum) { console.log('2+2 is', sum); }); // -> 4
第一个比较容易看

许多节点API具有异步版本,但没有同步版本。当使用这些API时,显然需要使代码异步


在您有选择的情况下(例如在读取文件时),问问自己:“阻塞调用是否会让最终用户等待不合理的时间?”。在应用程序启动期间,答案通常为“否”,因为该代码只运行一次,最终用户没有机会接触服务器。但是,如果您正在响应web请求,那么让所有用户等待出站API调用或磁盘读取将降低所有用户的网站速度,而非阻塞调用允许节点继续处理新请求,直到您请求的数据返回。

使用非阻塞调用的主要动机是您正在等待某些外部进程或设备返回,因此您可以释放对线程的控制,以允许其他操作“在您等待时”运行

因为使用回调的非阻塞/异步代码更难编写、读取和维护,所以您应该避免使用非阻塞代码,除非它会影响应用程序的性能和可伸缩性,或者您正在使用的API需要非阻塞代码

考虑一下这个相对愚蠢的例子:

  function add(a,b,cb) { cb(a+b); }
  console.log('2+2 is', add(2,2)); // -> 4

  function add(a,b) { return a+b; }
  add(2,2,function(sum) { console.log('2+2 is', sum); }); // -> 4
第一个比较容易看

许多节点API具有异步版本,但没有同步版本。当使用这些API时,显然需要使代码异步


在您有选择的情况下(例如在读取文件时),问问自己:“阻塞调用是否会让最终用户等待不合理的时间?”。在应用程序启动期间,答案通常为“否”,因为该代码只运行一次,最终用户没有机会接触服务器。但是,如果您正在响应web请求,则让所有用户等待出站API调用或磁盘读取将降低所有用户的站点速度,而非阻塞调用允许节点继续处理新请求,直到您请求的数据返回。

尽管这两个示例都是非阻塞的(根据正常定义),因为添加两个数字不会导致cpu无法运行。i/o操作通常是这样的。尽管这两个示例都是非阻塞的(根据正常定义),因为添加两个数字不会导致cpu被阻塞运行。i/o操作通常会这样做