簡體   English   中英

Node.js通過if和async調用控制流程

[英]Node.js control flow with if and async call

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

節點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;
    });
}

如果過濾器對象中有許多屬性,則需要使用遞歸。

使用異步模塊。 Async.parallel將並行執行兩個查詢。 使用async.series一個接一個地執行。

您應該考慮使用JavaScript Promise。 使用它們時,您不必處理node.js將您帶入的回調地獄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM