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操作通常会这样做