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

Posted

技术标签:

【中文标题】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 异步编程 - 为啥需要“异步”模块?啥是“回调地狱”/“末日金字塔”?的主要内容,如果未能解决你的问题,请参考以下文章

七天学会NodeJS系列教程之异步编程

[NodeJS]Node异步编程基础

nodejs 中的异步之殇

Nodejs异步编程

Nodejs异步编程

使用 nodejs 异步和请求模块