2011-03-20 60 views
17

nodejs中的所有内容都是非阻塞的,这很好,但是我怎样才能做出必须一个接一个的函数alls而没有一个巨大的嵌套回调列表?在nodejs中编写“阻塞”代码

+2

Node.js适用于非阻塞代码。你正在反对这个流程,并试图阻止它存在的目的。 – 2012-02-08 22:13:02

回答

12

你不要必须嵌套你的回调。

写异步代码有很多模式。

例如,这matrioska嵌套式...

database.find('foo', function (err, data) { 
    database.update('foo', 'bar', function (err, data) { 
    database.delete('bar', function (err, data) { 
     console.log(data); 
    }); 
    }); 
}); 

...可以在清洁重写(但更详细)方式:

var onDelete = function (err, data) { 
     console.log(data); 
    }, 

    onUpdate = function (err, data) { 
     database.delete('bar', onDelete); 
    }, 

    onFind = function (err, data) { 
     database.update('foo', 'bar', onUpdate); 
    }; 

database.find('foo', onFind); 

另一种选择是使用一个抽象串行和并行执行回调的模块。

+1

我成功的模式是使用Promise Library,比如BlueBird:https://github.com/petkaantonov/bluebird/blob/master/API.md#promisification和我使用的模式(比如masylum说)是在下面的文章中的“菜鸟错误1”下提出的:http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html – 2015-07-20 15:42:11

8

UseStep

它是“一个简单的node.JS控制流库,可以实现并行执行,串行执行和错误处理。

+0

-1这不是一个答案。这只是一个链接。 – Raynos 2011-03-20 04:26:24

+5

+1这是一个答案,虽然简洁,但我可能指向整个控制流库列表https://github.com/joyent/node/wiki/modules#wiki-async-flow – talentedmrjones 2011-12-13 03:27:53

+3

@Chetan:链接没问题,但你不需要点击链接就可以知道你的意思。链接的简要说明应在此处 – 2012-02-08 22:11:36

2

你真正想要做的是找出你的操作为什么被阻塞并重新编码,以便它们是非阻塞的。删除彼此之间的依赖关系。你需要改变你对非阻塞IO的思考方式。

使用库来允许您以同步阻塞的方式运行此类型的代码只是一个可怜的拐杖。

如果在node.js中编写非阻塞代码,你将会明显感觉更好,因为这就是它设计的目的。

1

async module是一个非常好的解决方案 - 使用它可以产生更简洁的异步代码,并且嵌套更浅。您可以通过获得它:

npm install async --save 

特别是看看:

  • async.series:这可以让你设置的功能清单,跑了一个又一个 - 每个在列表只能在完成之前运行。但是,其他代码(定义的系列之外)可以不受阻塞地运行。
  • async.series:这与async.series类似,除了列表上的每个函数都将其结果传递给列表中的下一个元素,并将最终结果传递给在末尾定义的回调函数。

但是,所有async's control flow-specific methods都非常有助于避免巨大的嵌套回调列表。

另外,如果有帮助,请在学习库时提供here's a jsFiddle I put together,其中包含一组示例,其中包含一个for async.waterfall &另一个for async.series(打开控制台以查看它在做什么)。