我正在将rails代码移植到node.js并遇到控制流问题。什么是在代码下面移植的最佳方式:
filter = {blah:blah};
result = {};
if(filters.something) {
asyncDBCall(function(){
result.something = somevalue;
});
}
if(filters.someOtherThing) {
asyncDBCall(function() {
result.someOtherThing = someothervalue;
});
}
return result;
答案 0 :(得分:0)
节点JS的主要优点和缺点是它在执行函数时具有异步性质。你的代码应该是
if (filters.something) {
asyncDBCall(function() {
result.something = somevalue;
return result;
});
}
if (filters.someOtherThing) {
asyncDBCall(function() {
result.someOtherThing = somevalue;
return result;
});
}
但是,如果两种情况都可能成立。在这种情况下,您必须等待另一个asyncDBCall完成,然后再进行下一个asyncDBCall。代码是
if (filters.something) {
asyncDBCall(function() {
result.something = somevalue;
if (filters.someOtherThing) {
asyncDBCall(function() {
result.someOtherThing = somevalue;
return result;
});
}
});
}
还有另一种解决方案可以同时发送两个请求。
var someFlag = false, someOtherFlag = false;
if (filters.something) {
asyncDBCall(function() {
result.something = somevalue;
someFlag = true;
if (someFlag && someOtherFlag)
return result;
});
}
if (filters.someOtherThing) {
asyncDBCall(function() {
result.someOtherThing = somevalue;
someOtherFlag = true;
if (someFlag && someOtherFlag)
return result;
});
}
如果过滤器对象中有许多属性,则需要使用递归。
答案 1 :(得分:0)
使用异步模块。 Async.parallel将并行执行两个查询。使用async.series一个接一个地执行。
答案 2 :(得分:0)
您应该考虑使用JavaScript承诺。当你使用它们时,你不必处理node.js驱使你进入的回调地狱。