有大量的图书馆可以帮助修复回调综合症层。
事实上,有太多,我使用哪一个?
答案 0 :(得分:44)
我使用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(){ ... }
]);
答案 1 :(得分:6)
答案 2 :(得分:5)
我喜欢使用promises from Q:
如果函数无法返回值或在不阻塞的情况下抛出异常,则可以返回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,它被捕获并处理。
回调方法称为“控制反转”。接受回调而不是返回值的函数是:“不要打电话给我,我会给你打电话。” Promise取消反转,将输入参数与控制流参数完全分开。这简化了API的使用和创建,特别是可变参数,休息和传播参数。
答案 3 :(得分:0)
我与其他同步库存在的问题是他们经常要求我在开始时定义我的所有任务,并且没有提供我找到的干净直观的API。我只想将任务推送到一个组,无论何时何地,然后以并行或串行的方式执行该组。
我喜欢TaskGroup中的流功能,并将其用于许多大型项目,包括DocPad和BugHerd。 Examples are in the README.