首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Towerjs的关系模型(coffeescript和mongodb)

使用Towerjs的关系模型(coffeescript和mongodb)
EN

Stack Overflow用户
提问于 2012-05-24 00:06:16
回答 2查看 272关注 0票数 0

我需要恢复towerjs (与mongodb商店)报价股票从所有股票在所有交易的一个用户。这段代码不起作用,while循环不会停止,但我不明白为什么

代码语言:javascript
复制
    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
EN

回答 2

Stack Overflow用户

发布于 2012-05-24 12:29:36

看起来有几个地方可能会出现问题。

在第一个while循环中,我不确定您是不是这个意思:

代码语言:javascript
复制
idst[trade.get('stockTicker')] = 1  if trade.get('stockId') and not idst[trade.get('stockId')]

最后一位,idst[trade.get('stockId')]永远不会设置。但这不会中断while循环,因此可能不是问题所在。

主要的问题是,因为第二个和第三个while循环都在异步App.Trade.where函数中,所以它们不会正常工作。

此外,以下代码将不起作用,因为每次迭代都会调用异步代码:

代码语言:javascript
复制
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。你可以这样做:

代码语言:javascript
复制
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 )。这使得在心理上处理这种异步特性变得更容易。

如果有效的话,请告诉我。干杯。

票数 2
EN

Stack Overflow用户

发布于 2012-05-24 14:22:15

我的天你的代码看起来很糟糕。(嵌套作用域中的许多i++i < length )请...不要那样写代码,太难闻了。嵌套循环会导致代码难以阅读,尤其是有影子变量。

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

代码语言:javascript
复制
some_var = "I am normal"
shadow_it = -> 
  some_var = "this is the shadow"
  # blabla

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10723805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档