2014-04-07 55 views
0

在我的節點應用程序中,我使用了sequelize ORM。因爲我必須執行3個查詢,畢竟我必須將這些結果合併爲JSON格式。node.js + sequelize +查詢執行

我的查詢:

try { 
    sequelize.query("select id_0, name_0, id_1, name_1 from xxxx group by id_0, name_0, id_1, name_1").success(function (result) { 
     finalResult = result; 

    }) 
} catch (err) { 

} 

try { 
    sequelize.query("select yyyyyyyyyy(JSON datatype) as value from xxxxx limit 1").success(function (valueResults) { 
     valueResults = valueResults[0].value; 
     valueResults = JSON.parse(valueResults); 
     for (var prop in valueResults) { 
      keyResult.push(prop); 
     } 
    }) 
} catch (err) { 

} 

try { 
    sequelize.query("select country_name, level0, level1, level2, level3, level4 from levels").success(function (result) { 
     //console.log("ccccccc=" +util.inspect(levelsResult)); = result; 
     levelsResult = result; 

    }) 
} catch (err) { 

} 

我有3個輸出爲單相結合,我必須格式化成JSON。當我試圖打印這3個輸出,最後由於異步調用而空着。請幫我解決這個問題。提前感謝。

+0

請不要連續編輯您的問題。如果你想引起更多關注,請添加賞金。 – SomeKittens

回答

2

您可以使用流量控制包來解決這個問題。有很多純JS的方法,但是像async這樣的包或者一些promise實現也可以工作(除非你需要練習)。

async中的一個例子是async.seriesasync.parallel方法(如果需要順序或並行,請確定您的呼叫順序)。就像這樣:

var async = require('async'); 

async.parallel({ 
    query1 : function(cb){ 
    //perform query here. Put cb() inside callback, where you get results 
    cb(null, "result1"); 
    }, 
    query2 : function(cb){ 
    //perform query here. Put cb() inside callback, where you get results 
    cb(null, "result2"); 
    }, 
    query3 : function(cb){ 
    //perform query here. Put cb() inside callback, where you get results 
    cb(null, "result3"); 
    } 
},function parallelFinal(parallelErr, parallelResults){ 
    if(parallelErr) throw new Error("Something bad!"); 
    console.log("Results are " + JSON.stringify(parallelResults)); 
}); 

結果:

結果是{ 「QUERY1」: 「RESULT1」, 「QUERY2」: 「結果2」, 「QUERY3」: 「result3」}

您可以根據需要設置和操作生成方法中的對象。

1

要麼去與解決方案@clay告訴你還是做查詢回調裏面的查詢,即:

var result1, result2, result3 
try { 
    sequelize.query("select foo from bar").success(function (foo) { 
    result1 = foo; 
    try { 
     sequelize.query("select foo2 from bar2").success(function (bar) { 
      result2 = bar; 
      //do the 3rd query here 
     }); 
    } catch (e) { 

    } 
}) 
} catch (err) { 

} 

記住,這種做法是不實際的,當你想要做的幾個疑問,這種方法是一個簡單的阻止代碼,這與node.js的工作方式相反(非阻塞)