2012-05-23 21 views
0

我需要在towerjs(帶有mongodb商店)中的一個用戶的所有交易中的所有股票報價股票中恢復。 此代碼不工作,while循環不停止,但我不明白爲什麼與Towerjs(咖啡和mongodb)的關係模型

App.Trade.where(userId: @currentUser.get('id')).order("date", "desc").all (error, trades) -> 
     idst = {} 
     i = 0 
     len = trades.length   

     while i < len 
     trade = trades[i] 
     idst[trade.get('stockTicker')] = 1 if trade.get('stockId') and not idst[trade.get('stockId')] 
     i++ 

     App.Stock.where({ticker: {$in: Object.keys(idst)}}).all (error, stocks) -> 
     map = {} 
     mapQuote = {} 
     i = 0 
     len = stocks.length 

     while i < len 
      stock = stocks[i] 
      map[stock.get('ticker')] = stock 
      App.QuoteStock.where(ticker: stock.get('ticker')).order("createdAt", "desc").limit(1).first (error, quoteStock) -> 
      mapQuote[stock.get('ticker')] = quoteStock 
      i++ 

     i = 0 
     len = trades.length 
     while i < len 
      trade = trades[i] 
      trade.stock = map[trade.get('stockTicker')] 
      trade.quoteStock = mapQuote[trade.get('stockTicker')] 
      i++ 

     _this.trades = trades 
+0

「哪裏」異步? –

+0

是的,哪裏是異步的。 –

+0

在技術上,'all'和'first'是異步的,'where'只是建立查詢。 –

回答

2

它看起來像有哪裏的問題可能會發生的幾個地方。

在第一while循環,我不知道,如果你的意思是這樣的:

idst[trade.get('stockTicker')] = 1 if trade.get('stockId') and not idst[trade.get('stockId')] 

最後一點,idst[trade.get('stockId')]永遠不會設置。但是這不會中斷while循環,所以可能不是問題。

最主要的是,因爲第二個和第三個while循環位於異步App.Trade.where函數內部,所以它們不能正常工作。

此外,以下將不起作用,因爲異步代碼被稱爲每次迭代:

while i < len 
    stock = stocks[i] 
    map[stock.get('ticker')] = stock 
    App.QuoteStock.where(ticker: stock.get('ticker')).order("createdAt", "desc").limit(1).first (error, quoteStock) -> 
    mapQuote[stock.get('ticker')] = quoteStock 
    i++ 

相反,你需要使用一個異步循環:https://github.com/caolan/async。你可以是這樣做的:

async = require('async') 

stocksIterator = (stock, next) -> 
    map[stock.get('ticker')] = stock 
    App.QuoteStock.where(ticker: stock.get('ticker')).order("createdAt", "desc").limit(1).first (error, quoteStock) -> 
    mapQuote[stock.get('ticker')] = quoteStock 
    next() 

async.forEachSeries stocks, stocksIterator, (error) -> 
    tradesIterator = (trade, next) -> 
    trade.stock = map[trade.get('stockTicker')] 
    trade.quoteStock = mapQuote[trade.get('stockTicker')] 
    next() 

    async.forEachSeries trades, tradesIterator, (error) -> 
    _this.trades = trades 

另外,如果我是你,我會把這些迭代器成單獨的功能,或者使用不同的指標變量(ijk爲例)。它讓精神上處理這個更容易的異步性質。

讓我知道這是否有效。乾杯。

1

噢,我的上帝,你的代碼看起來很糟糕......(太多i++i < length,嵌套範圍)請不要用這種方式編寫代碼,聞起來太糟糕。嵌套循環導致你的代碼太難閱讀,尤其是影子變量。

所以,你遇到的問題是「影子變量」,它看起來像:

some_var = "I am normal" 
shadow_it = -> 
    some_var = "this is the shadow" 
    # blabla 

我建議你提高算法的實現,避免使用陰影變量。