nodejs的回调函数里为啥需要return

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodejs的回调函数里为啥需要return相关的知识,希望对你有一定的参考价值。

return 不光是结构性好,最大的好处是可以防止出错,特别是callback里的callback,很多时候你if(xx) callback(); else .... 后面其实还有逻辑,很多人写着写着就忘了,最后else结束了再执行个callback或者其他事情,整个逻辑就崩溃了。所以这时候在if里return是非常有必要的(在某一行确定函数需要在此结束的时候)。当然不return,人工来保证也是可以的,但是别人来写就很难保证了,我们代码里偶尔就会看到这种现象,代码量大了,维护的人多了。 参考技术A 提前返回,阻止后续程序继续运行。因为js是异步的,如果没有return callback后,后面的代码还会执行,但是你加上if else 能确保callback后,后面没有可执行的代码也可以没有return。 参考技术B 提前返回,阻止后续程序继续运行。因为js是异步的,如果没有return callback后,后面的代码还会执行,但是你加上if else 能确保callback后,后面没有可执行的代码也可以没有return。本回答被提问者和网友采纳

Nodejs 异步编程 - 为啥需要“异步”模块?啥是“回调地狱”/“末日金字塔”?

【中文标题】Nodejs 异步编程 - 为啥需要“异步”模块?啥是“回调地狱”/“末日金字塔”?【英文标题】:Nodejs Asynchronous Programming - why there is "async" module required? What is "Callback Hell" / "Pyramid of Doom"?Nodejs 异步编程 - 为什么需要“异步”模块?什么是“回调地狱”/“末日金字塔”? 【发布时间】:2017-03-20 08:53:29 【问题描述】:

NodeJS 的最大特点之一是它是开箱即用的asynchronous,但作为NodeJS 的初学者,如果这样的话,为什么会存在async 这样的模块有点令人困惑已经在本地处理了吗?

https://www.npmjs.com/package/async

我认为有一个很好的理由,但这对我来说并不明显。是处理callback hell还是Pyramid of Doom

【问题讨论】:

我不明白你所说的“nodejs 是开箱即用的异步”是什么意思。我不知道说任何语言或实现是“异步的”是什么意思。你的意思是 JS 的某些特性,例如可以用作回调的一等对象的函数,或者非阻塞 I/O,适合异步编程吗?你在哪里读到的? @torazaburo codementor.io/codeforgeek/… 这大致就像在说“火腿是开箱即用的食物,那我为什么要做三明治呢?”。 @torazaburo 鸡蛋仍然是无骨鸡 【参考方案1】:

阅读说明:

Async 是一个实用模块,它提供了直接、强大的功能用于处理异步 JavaScript

它不“提供”异步函数,它提供了使用异步 javascript 的函数。

注意:javascript 并非全部异步,只是异步部分是异步的。

换一种说法

async 不会使 nodejs 异步,它通过其糖衣的优点使使用异步代码更简单

【讨论】:

我知道javascript不是异步的,但nodejs运行时是异步的,那我为什么要在nodejs中使用异步模块呢? but the nodejs runtime is 是什么?异步?你在哪里读到的?此外,您显然不明白async 库提供了用于处理异步javascript的函数——它为常见的异步“模式”提供了简单的“糖”函数 我在这里找到它***.com/questions/10570246/… 并且再次这个问题只针对 nodejs 而不是 vanilla javascript Applogies,我确实看到 nodejs 在 nodejs about page 中被描述为 一个异步事件驱动的 JavaScript 运行时 - 但是,async 不会使 nodejs 异步,它有助于编写更简单的异步代码 不,你会使用 async 使编写异步代码“更容易”(嗯,这对某些人来说更容易) - 这样想 - 许多客户端开发人员使用 jQuery - jQuery 不会添加任何东西对于它还不能做的javascript,它 javascript 一开始,它所做的只是让常见的任务更容易...... async 用常见的异步任务来做到这一点【参考方案2】:

当你在NodeJS中使用异步编程时,你可能会结束 当您有更多数量的异步函数要一个接一个地调用时,请使用 Callback HellPyramid of Doom,如下所示。

回调 - 一旦你的第一个函数被异步执行,你的主线程应该被通知它。为此,您将传递一个函数为callback,一旦异步操作完成,该函数将被触发。

当您在链中或在一个大循环中拥有更多数量的异步函数时,您可能必须传递相同数量的回调来找出每个操作的完成情况以及最后一个来执行其他操作,例如返回响应等等

当您使用更多数量的回调对它们进行编码时,管理/维护变得非常困难,并且缺乏更好的可读性,如下所示。

getData(function(a)  
    getMoreData(a, function(b)
        getMoreData(b, function(c) 
            getMoreData(c, function(d) 
                getMoreData(d, function(e) 
                    ...
                );
            );
        );
    );
);

为了消除这些缺点并提高可读性和 维护,我们可能会使用其他模块,例如asyncbluebird 等等。你可以选择任何你喜欢的,看起来更适合你的 在理解和满足所有要求方面 把事情弄得太复杂了。

无论如何,这完全取决于您是否可以使用callback hell 或其他模块。

要深入了解,

https://strongloop.com/strongblog/node-js-callback-hell-promises-generators/

【讨论】:

callback hellpyramid of doom - 我忘了提到那些:p

以上是关于nodejs的回调函数里为啥需要return的主要内容,如果未能解决你的问题,请参考以下文章

nodejs异步回调函数中this问题,求助

nodejs 异步应该如何处理

ajax success回调函数里return undefined的原因?

nodejs Async 使用方法(解决多层回调嵌套)

Nodejs的运行原理-函数回调篇

nodejs知识结构