2014-03-28 96 views
1

在我的節點應用程序中,我必須執行2個查詢1,一個接一個(即)我必須執行基於第一個查詢結果的第二個查詢。node.js + sequelize +連續執行

我的代碼:

var levels; 
     try { 
      sequelize.query("Select * from levels where country_id = " + level0 + "").success(function(results) { 
       levels = results;    
      }).failure(function(err) { 
       if (err) { 
        logger.error(err.stack); 
        throw (err); 
       } 
       else { 
        if (callback) { 
         callback(err, null); 
        } 
       } 
      }); 
     } 
     catch (err) { 
     } 


if (level == 2) { 
     query = "select *from xxxxxx where " + query + " and leveltype = "+levels[0].name_2+"";-----------------------------------------------------------> this is from 1st query 

     try { 
      sequelize.query(query).success(function(results) { 
       results = tsv.stringify(results); 
       onSuccess(results, callback) 
      }).failure(function(err) { 
       if (err) { 
        logger.error(err.stack); 
        throw (err); 
       } 
       else { 
        if (callback) { 
         callback(err, null); 
        } 
       } 
      }); 
     } 
     catch (err) { 
      logger.error(err.stack) 
     } 
    } 

請幫我解決這個問題。提前致謝。

+0

我不熟悉續集模塊。在node_sqlite3中,可以通過在第一個查詢的成功回調中發送第二個查詢來對查詢進行排序,然後在第二個查詢的成功回調中,您知道這兩個查詢都已成功。 – Paul

回答

3

Sequelize使用藍鳥承諾:

sequelize.query("Select * from levels where country_id = " + level0 + "").success(function(results) { 
       levels = results;    
      }).failure(function(err) { 
       if (err) { 
        logger.error(err.stack); 
        throw (err); 
       } 
       else { 
        if (callback) { 
         callback(err, null); 
        } 
       } 
      }); 
     } 

可以變成:

sequelize.query("Select * from levels where country_id = " + level0 + "") 
     .then(function(results) { 
      levels = results;    
     }); 

承諾鏈:

sequelize.query("Select * from levels where country_id = " + level0 + "") 
.then(function(levels) { 
    var query = "select *from xxxxxx where " + query + 
       " and leveltype = "+levels[0].name_2+"" 
    return sequelize.query(query); 
}).nodeify(callback); // turn back from promise API to callback API 

而這個代碼基本上做一切你上面的代碼呢:)

  • 你不需要try/catch,如果(err)檢查承諾 - 他們會爲你處理它。如果你扔進一個承諾處理程序,你是安全的。
  • 承諾鏈,如果返回從。於是承諾的價值,它會與承諾解決它(這意味着你可以添加一個.then處理)

你可以做的更好,雖然,你可以返回承諾的價值(即 - return sequelize.query)並完全切換到承諾API。

+0

感謝您的寶貴時間..作爲@保爾傷心我已經執行第一次查詢成功模塊中的第一個..它爲我工作..是否建議這樣做..也爲您的上述代碼是否需要安裝任何包? ? – Subburaj

+1

@Subburaj哪個代碼你會發現更長和更具可讀性?此外,Paul建議您錯過了免費獲得的強大諾言API的要點 - 請參閱我的問答:http://stackoverflow.com/questions/22539815/arent-promises-just-callbacks解釋方法的優點I建議。您還可以通過'.nodeify'免費轉換'.then'諾言到節點回調' –