在nodejs中编写“阻塞”代码

nodejs中的所有东西都是非阻塞的,这是很好的,但是我怎样才能做出一个接一个的函数,而没有一个巨大的嵌套callback列表呢?

你不必嵌套你的callback。

编写asynchronous代码有很多模式。

例如,这个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); 

另一种select是使用一个模块来抽象串行和并行执行callback。

使用 步骤 。

它是“一个简单的node.JS控制stream库,可以并行执行,串行执行和error handling。

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

使用一个库来允许你以同步阻塞的方式运行这个types的代码只是一个可怜的拐杖。

你将学习如何在node.js中编写非阻塞代码,因为这就是它devise的目的。

asynchronous模块是一个非常好的解决scheme – 使用它会产生更简洁的asynchronous代码,嵌套更浅。 你可以通过以下方式获取:

 npm install async --save 

特别要看看:

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

但是,所有asynchronous的控制stream特定的方法对避免巨大的嵌套callback列表非常有帮助。

另外,如果有帮助的话, 这里有一个jsFiddle,当我学习库时,它包含了一组示例,包括一个用于async.waterfall和另一个用于async.series(打开控制台以查看它在做什么)的库。