我想从瀑布功能用链条跳转的功能asyncjs
中nodejs
。
我的代码如下所示:
async.waterfall([
function(next){
if(myBool){
next(null);
}else{
// Bypass the 2nd function
}
},
// I want to bypass this method if myBool is false in the 1st function
function(next){
},
// Always called
function(next){
}
]);
你知道正确的方式做到这一点不认沽:
if(!myBool){
return next();
}
在功能我想绕过。
谢谢 !
另一种可能是:
var tasks = [f1];
if(myBool){
tasks.push(f2);
}
tasks.push(f3);
async.waterfall(tasks, function(err, result){
});
其中, f1
, f2
和f3
是你的职责。
除此之外,你最好还是明确地做这件事,避免使你的代码过于复杂,简单的通常是更好
更新:
function f1(done){
if(myBool){
f2(done);
}else{
done();
}
}
function f2(done){
async.nextTick(function(){
// stuff
done();
});
}
async.waterfall([f1,f3],function(err,result){
// foo
});
我想,这应该工作:
var finalCallback = function(err, result){
if(err)
// handle error..
else
console.log('end! :D');
}
async.waterfall(
[
function step1(callback){
// stuff
callback(null, someData);
},
function step2(someData, callback){
if(skip_step_3)
finalCallback(null, someData);
else
callback(null, someData);
},
function step3(moreData, callback){
// more stuff
callback(null, moreData);
}
],
finalCallback
)
异步的创建者建议更换这在GitHub库( https://github.com/caolan/async/pull/85 )
使用IF-异步模块的代码如下所示:
var async = require('async')
var ifAsync = require('if-async')
async.waterfall([
foo,
ifAsync(p1).then(c1).else(c2),
bar
], function(err) {})
全例如这里看看: https://github.com/kessler/if-async#example-2-using-with-asyncjs-waterfall
我来不及回答,但异步的if-else可能会帮助你。
示例代码
var async = require('async-if-else')(require('async'));
function emailExists(user, callback) {
user.find(user.email, function(err, dbUser){
if (err)
return callback(error);
if(!dbUser)
return callback(null, false); // does not exist, predicate will be false
callback(null, true);
});
}
function updateAccount(user, callback) {
user.update( ..., callback);
}
function importFromLegacyByEmail(user, callback) {
remoteClient.get(user, callback);
}
async.waterfall([
async.constant({email: 'thiago@email.com', dogs: 2, money: 0, fun: 100 }),
async.if(emailExists, updateAccount).else(importFromLegacyByEmail),
sendEmail
], handler);
我会建议使用clojurescript它有一个真棒核心异步库异步调用处理时使生活超级简单。
在你的情况,你会写是这样的:
(go
(when-let [res1 (<! (asyncFunc1))]
(<! (asyncFunc2 res1)))
(<! (asyncFunc3)))
注意go
的宏,这将导致身体异步运行,以及<!
功能,这将阻塞,直到异步函数将返回。
该代码将在所述第一异步函数第一个块。 然后,如果这个结果是真实的,它会在运行在块中的第二异步功能以及。 最后,它将运行第三异步功能和阻断。