我最近刚刚开始使用事件驱动的体系 struct ,它来自一种非常标准的面向对象的思维方式.

我注意到的第一件事是,理解和跟踪程序的难度似乎随着程序的大小呈指数增长.虽然小型宠物项目很容易遵循,但感觉代码很快就会变成意大利面条.

我知道我对这种开发思维方式还不熟悉,并不是所有面向对象的担忧都会延续下go .有没有关于编写可维护、可理解的事件驱动代码的资源?使用node的人应该做什么.js或Twisted或事件机对此怎么办?

推荐答案

我将以Python为例,因为这就是我现在用来构建大型分布式应用程序的方法.

Twisted python允许使用inlinecallbacks或(稍微难看一点的)deferredGenerator样式实现非常必要的样式.这些方法允许您编写使用事件驱动回调代码的过程,这些代码更易于阅读和理解.该实现将函数转换为一个延迟序列,从而产生一个延迟序列.

具体来说,您不必构建一组嵌套很深的回调函数/lambdas/closures,而是可以在任意点将函数的控制权交还给事件循环.如果你愿意的话,你可以在心里把它重新标记为协同工作或协同多任务处理.它完成了任务.例如(使用更丑陋的deferredGenerator样式)如下:

@defer.deferredGenerator
def foo(arg):
    bar = nonBlockingFunction(foo)
    baz = waitForDeferred(aFunctionThatReturnsADeferredToo(bar))
    yield baz #Returns control to the event loop
    output = baz.getResult() #This gets the output of aFunctionThat...Too above
    yield output #This is how we return a result instead of using return

@defer.deferredGenerator
def aFunctionThatReturnsADeferredToo(put_bar_here):
    """Stuff happens here...."""
    ...etc...

这里还有一篇文章展示了inlineCallbacks方法,它更简洁,但需要python 2.5或更高版本(这意味着不低于Centos/RHEL 5系列,遗憾的是我的应用程序一直使用它).如果你能用的话就这么做.

正如您所看到的,这看起来像是您所知道和喜爱的老式python命令式工具,但是如果没有大量嵌套函数和lambda,维护起来会更容易.但我还是希望python有块.

至于调试,您可以使用defer打开twisted reactor调试.setDebugging(True)调用初始化代码中的某个地方.这将附加在代码中引发异常的原始回溯,以便您可以轻松地看到错误实际发生的位置.只需记住在开始制作之前对setDebugging语句进行修订,因为它会导致大量额外的内省(如果你想彻底震惊,请仔细观察).

Node.js相关问答推荐

如何将Node.js与Nuxt.js一起使用?

Gmail API获取附件PDF未正确呈现.我遗漏了什么?

MongoDB的方面查询的Postgres类似功能

使用AWS SDK for JavaScript V3将图像从node.js上传到s3 bucket

即使卷已设置,Docker Nodemon 也不会热重载

Indexeddb 获取所有不同于特定值的记录

使用 node/express/Multer,您如何首先判断参数?

使用 firebase 函数 api 运行套接字(相同的端口创建问题)

如何刷新 youtube-data-api v3 的访问令牌

node.js 中 res.setHeader 和 res.header 的区别

具有多个条件的mongoose 查找

使用 ES6 语法和动态路径导入模块

为什么我们要为 Angular 2.0 安装 Node.js?

为什么模块级返回语句在 Node.js 中起作用?

Fluxible 中的脱水和再水合代表什么?

如何从 findOneAndUpdate 方法中获取更新的文档?

如何在express 中设置默认路径(路由前缀)?

如何在 NodeJS 中拆分和修改字符串?

如何断言不为空?

nodemon + express,监听端口=?