2014-07-24 106 views
2

我試圖運行多個SQL查詢。在node.js中運行多個MSSQL查詢

問題是由於fire.and忘記node.js使用變量不斷超出範圍。我正在努力研究如何在C#中執行類似於await關鍵字的操作。

這是我破碎的代碼,是;這應該使它更清晰,我試圖達到什麼:

function getTopicsForMessages(request, results) 
{ 
    //Get topics for this message 
    var queryString = "SELECT ripple_messenger.TopicTypes.name, ripple_messenger.TopicTypes.imageUri"; 
    queryString += " FROM ripple_messenger.MessageTopics JOIN ripple_messenger.TopicTypes"; 
    queryString += " ON (ripple_messenger.MessageTopics.topicId = ripple_messenger.TopicTypes.id)"; 
    queryString += " WHERE messageId = ?"; 

    for (var i = 0; i < results.length; i++) 
    { 
     mssql.query(queryString, [results[i].id], 
     { 
      success: function (topicsResults) 
      { 
       results[i].topics = topicsResults; 
      }, 
      error: function (err) { 
       console.error("SQL Read error: " + err); 
       request.respond(statusCodes.INTERNAL_SERVER_ERROR, "SQL Query failed on read"); 
      } 
     }); 
    } 
    //Continue... once all queries have executed successfully. 
} 

我認爲這只是一個問題,不完全知道節點的做事方式。

我已經閱讀了幾個關於Node.js的包/選項,它們允許類似於await關鍵字的東西,但我不確定當我使用Azure移動服務時是否能夠使用它們。

我也確定我可以以某種方式在SQL中更好地執行此查詢。但是,我不太清楚如何。

提前許多感謝,

丹尼

+0

:http://stackoverflow.com/questions/17351494/promises-pattern-in-node-js-libraries-to-use – Populus

+0

您使用的快遞? – Dalorzo

回答

0

下面的代碼顯示了一種可能的實現。由於node.js中的所有數據庫調用都是異步的,因此如果將它們運行到「常規」循環中,您將同時向數據庫發送所有調用,並且可能會觸發一些配額。下面的代碼一次發送一個查詢(通過等待直到一個呼叫完成來呼叫下一個呼叫)。您也可以並行發送一些查詢(使用類似於this post中顯示的配料技術)。

function getTopicsForMessages(request, results) 
{ 
    //Get topics for this message 
    var queryString = "SELECT ripple_messenger.TopicTypes.name, ripple_messenger.TopicTypes.imageUri"; 
    queryString += " FROM ripple_messenger.MessageTopics JOIN ripple_messenger.TopicTypes"; 
    queryString += " ON (ripple_messenger.MessageTopics.topicId = ripple_messenger.TopicTypes.id)"; 
    queryString += " WHERE messageId = ?"; 

    var queryNextItem = function(i) { 
     if (i >= results.length) { 
      // All done 
      continuation(); 
     } else { 
      mssql.query(queryString, [results[i].id], 
      { 
       success: function (topicsResults) 
       { 
        results[i].topics = topicsResults; 
        queryNextItem(i + 1); 
       }, 
       error: function (err) { 
        console.error("SQL Read error: " + err); 
        request.respond(statusCodes.INTERNAL_SERVER_ERROR, "SQL Query failed on read"); 
       } 
      }); 
     } 
    } 

    queryNextItem(0); 

    function continuation() { 
     //Continue... once all queries have executed successfully. 
    } 
} 
你想使用使用承諾模式