Mer*_*erc 3 asynchronous node.js
我有两个功能:
function one(next){
Users.find({}, function(err, docs){
if( err)
next( err );
} else {
next( null );
}
});
}
function two(next){
Something.find({}, function(err, docs){
if( err)
next( err );
} else {
next( null );
}
});
}
Run Code Online (Sandbox Code Playgroud)
我可以使用异步库:
async.series( [one, two], function( err ){
...
});
Run Code Online (Sandbox Code Playgroud)
这里,如果one()返回err,则立即调用回调(使用err set).什么是async.series 的简单 BASIC实现?我查看了库的代码async(这很棒),但它是一个库,意味着要做很多事情,而且我遇到它真的很麻烦.
你能告诉我一个简单的async.series实现吗?东西,它可以简单的叫对方后功能之一,而且-如果他们中的一个调用一个错误回调-被调用最终回调函数err集?
谢谢...
芝加哥商业交易所.
一个实现将是这样的:
function async_series ( fn_list, final_callback ) {
// Do we have any more async functions to execute?
if (fn_list.length) {
// Get the function we want to execute:
var fn = fn_list.shift();
// Build a nested callback to process remaining functions:
var callback = function () {
async_series(fn_list,final_callback);
};
// Call the function
fn(callback);
}
else {
// Nothing left to process? Then call the final callback:
final_callback();
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码不处理结果或错误的处理.要处理错误,我们只需检查回调中的错误情况,并在出错时立即调用最终回调:
function async_series ( fn_list, final_callback ) {
if (fn_list.length) {
var fn = fn_list.shift();
var callback = function (err) {
if (err) {
final_callback(err); // error, abort
}
else {
async_series(fn_list,final_callback);
}
};
fn(callback);
}
else {
final_callback(null); // no errors
}
}
Run Code Online (Sandbox Code Playgroud)
处理结果可以类似地通过跟踪闭包中的结果数组或将其传递给下一次调用async_series来完成.
请注意,最终的最终回调可以假定没有错误,因为它通过if(err)(else)async_series调用到达那里.
| 归档时间: |
|
| 查看次数: |
897 次 |
| 最近记录: |