Node.js使用if和async调用控制流

时间:2014-06-11 11:10:42

标签: javascript ruby-on-rails node.js

我正在将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;

3 个答案:

答案 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驱使你进入的回调地狱。