0

我需要从一个用户的所有交易中的所有股票中恢复 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
4

2 回答 2

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

此外,如果我是你,我会将这些迭代器中的每一个放入单独的函数中,或者使用不同的索引变量(例如i, j) 。k它使精神上更容易处理这种异步性质。

让我知道这是否有效。干杯。

于 2012-05-24T04:29:36.470 回答
1

哦,我的上帝,你的代码看起来很糟糕......(在嵌套范围内有这么多i++, i < length,)请......不要这样写代码,闻起来太糟糕了。嵌套循环会导致您的代码难以阅读,尤其是存在影子变量。

所以,你遇到的问题是“影子变量”,它看起来像:

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

我建议你改进算法的实现,避免使用影子变量。

于 2012-05-24T06:22:15.297 回答