我需要恢复towerjs (与mongodb商店)报价股票从所有股票在所有交易的一个用户。这段代码不起作用,while循环不会停止,但我不明白为什么
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发布于 2012-05-24 12:29:36
看起来有几个地方可能会出现问题。
在第一个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另外,如果我是你,我会把每个迭代器放在不同的函数中,或者使用不同的索引变量(例如i、j、k )。这使得在心理上处理这种异步特性变得更容易。
如果有效的话,请告诉我。干杯。
发布于 2012-05-24 14:22:15
我的天你的代码看起来很糟糕。(嵌套作用域中的许多i++、i < length )请...不要那样写代码,太难闻了。嵌套循环会导致代码难以阅读,尤其是有影子变量。
所以,你遇到的问题是“影子变量”,看起来是这样的:
some_var = "I am normal"
shadow_it = ->
some_var = "this is the shadow"
# blabla我建议你改进算法的实现,避免使用影子变量。
https://stackoverflow.com/questions/10723805
复制相似问题