【发布时间】:2011-07-05 14:14:11
【问题描述】:
有大量的库可以帮助修复回调综合症的层次。
其实太多了,我用哪一个?
【问题讨论】:
-
我很惊讶以前从未见过任何人(包括我自己)问过这个问题,这是一个很棒的问题!
标签: node.js asynchronous callback
有大量的库可以帮助修复回调综合症的层次。
其实太多了,我用哪一个?
【问题讨论】:
标签: node.js asynchronous callback
我在使用其他同步库时遇到的问题是,它们经常要求我在开始时定义所有任务,并且没有提供我发现的干净直观的 API。我只是想随时随地将任务推送到一个组,然后以并行或串行方式执行该组。
我喜欢 TaskGroup 中的流程功能,并将其用于许多大型项目,包括 DocPad 和 BugHerd。 Examples are in the README.
【讨论】:
async.queue 非常相似。但是它确实有一些有用的区别:您可以为同一个队列提供各种不同的函数,而不是仅仅为单个工作函数传递数据;当它们全部完成时,你会得到一个适当的回调,而使用async.queue,你只会得到不会给你所有结果的排水事件。如果你只需要后者,那么你可以使用async.map。
我喜欢用promises from Q:
如果一个函数不能在没有阻塞的情况下返回值或抛出异常,它可以返回一个 Promise。 Promise 是一个对象,它表示函数最终可能提供的返回值或抛出的异常。 Promise 也可以用作远程对象的代理来克服延迟。
在第一次通过时,promise 可以缓解“末日金字塔”:代码向右行进比向前行进更快的情况。
step1(function (value1) {
step2(value1, function(value2) {
step3(value2, function(value3) {
step4(value3, function(value4) {
// Do something with value4
});
});
});
});
使用 Promise 库,您可以展平金字塔。
Q.fcall(step1)
.then(step2)
.then(step3)
.then(step4)
.then(function (value4) {
// Do something with value4
}, function (error) {
// Handle any error from step1 through step4
})
.done();
使用这种方法,您还可以获得隐式错误传播,就像 try、catch 和 finally。第 1 步中的错误会一直流到第 5 步,并在那里被捕获和处理。
回调方法称为“控制反转”。一个接受回调而不是返回值的函数是在说,“不要打电话给我,我会打电话给你。”。承诺不反转反转,将输入参数与控制流参数清晰地分开。这简化了 API 的使用和创建,尤其是可变参数、rest 和 spread 参数。
【讨论】:
.then(step3, value16, value545) -> function step3(value16, value545, callback) { //... }
我使用Async.js。
Async 是一个实用模块 提供直截了当、功能强大的 用于工作的功能 异步 JavaScript。虽然 最初设计用于 node.js,也可以直接使用 在浏览器中。
示例
async.map(['file1','file2','file3'], fs.stat, function(err, results){
// results is now an array of stats for each file
});
async.filter(['file1','file2','file3'], path.exists, function(results){
// results now equals an array of the existing files
});
async.parallel([
function(){ ... },
function(){ ... }
], callback);
async.series([
function(){ ... },
function(){ ... }
]);
【讨论】: