Bag*_*ggz 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(){ ... }
]);
Run Code Online (Sandbox Code Playgroud)
我喜欢使用Q的承诺:
如果函数无法返回值或在不阻塞的情况下抛出异常,则可以返回promise.promise是一个对象,表示函数最终可能提供的返回值或抛出的异常.promise也可以用作远程对象的代理来克服延迟.
在第一次通过时,承诺可以缓解"厄运金字塔":代码向右前进的速度比前进的速度快.
step1(function (value1) {
step2(value1, function(value2) {
step3(value2, function(value3) {
step4(value3, function(value4) {
// Do something with value4
});
});
});
});
Run Code Online (Sandbox Code Playgroud)
使用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();
Run Code Online (Sandbox Code Playgroud)
使用这种方法,您还可以获得隐式错误传播,就像try,catch和finally一样.step1中的错误将一直流向step5,在那里捕获并处理它.
回调方法称为"控制反转".接受回调而不是返回值的函数是:"不要打电话给我,我会给你打电话." Promise取消反转,将输入参数与控制流参数完全分开.这简化了API的使用和创建,特别是可变参数,休息和传播参数.