nodejs中的所有内容都是非阻塞的,这很好,但是我怎样才能做出必须一个接一个的函数alls而没有一个巨大的嵌套回调列表?在nodejs中编写“阻塞”代码
回答
你不要必须嵌套你的回调。
写异步代码有很多模式。
例如,这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);
另一种选择是使用一个抽象串行和并行执行回调的模块。
我成功的模式是使用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
-1这不是一个答案。这只是一个链接。 – Raynos 2011-03-20 04:26:24
+1这是一个答案,虽然简洁,但我可能指向整个控制流库列表https://github.com/joyent/node/wiki/modules#wiki-async-flow – talentedmrjones 2011-12-13 03:27:53
@Chetan:链接没问题,但你不需要点击链接就可以知道你的意思。链接的简要说明应在此处 – 2012-02-08 22:11:36
你真正想要做的是找出你的操作为什么被阻塞并重新编码,以便它们是非阻塞的。删除彼此之间的依赖关系。你需要改变你对非阻塞IO的思考方式。
使用库来允许您以同步阻塞的方式运行此类型的代码只是一个可怜的拐杖。
如果在node.js中编写非阻塞代码,你将会明显感觉更好,因为这就是它设计的目的。
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(打开控制台以查看它在做什么)。
- 1. 非阻塞写入和阻塞recv
- 2. NodeJS上的阻塞函数
- 3. 使API调用阻塞nodejs
- 4. 编写非阻塞DOM功能
- 5. 编写PHP非阻塞应用程序
- 6. Java代码 - 线程彼此阻塞
- 7. 扭曲:使代码非阻塞
- 8. 节点代码是否阻塞?
- 9. 在node.js中编写嵌套的非阻塞循环
- 10. 如何在Node JS中编写非阻塞if语句?
- 11. 其他线程会在CUDA中的代码中阻塞吗?
- 12. 非阻塞式写入c
- 13. 上的OutputStream阻塞写operaion
- 14. 重构非阻塞nodejs do..while循环
- 15. nodejs和无阻塞的噩梦
- 16. mpi:阻塞与非阻塞
- 17. 在匿名管道上阻塞读写
- 18. 建议在C#中编写测试代码并在vb.net中编写代码
- 19. 在NodeJS中实现阻塞控制流程
- 20. 如何编写代码示例,在代码中缺少代码?
- 21. 在.Net中阻塞线程
- 22. 如何在Linux中显示进程状态(阻塞,非阻塞)
- 23. 在MPI中使用非阻塞发送和阻塞接收?
- 24. Node.js中的非阻塞代码不工作
- 25. 编写从代码
- 26. 编写代码一
- 27. 带延迟的阻塞/非阻塞
- 28. 嵌套Socket阻塞非阻塞SocketHi
- 29. 非阻塞PASV袜子和阻塞
- 30. 阻塞队列不阻塞线程?
Node.js适用于非阻塞代码。你正在反对这个流程,并试图阻止它存在的目的。 – 2012-02-08 22:13:02