无法在函数外获取查询结果

时间:2012-09-18 16:20:28

标签: mongodb coffeescript mongoose

我有这个类,我尝试用查询结果初始化数组属性:

class data
minute: []
hour:   []
constructor:    () ->
    findMin = events.find({"aggr":"minute"}).sort({$natural:-1}).limit(120)
    findHour = events.find({"aggr":"hour"}).sort({$natural:-1}).limit(14)
    findMin.execFind (errMin, resMin) ->
        for recMin in resMin
            @minute.push recMin
    findHour.execFind (errH, resH) ->
        for recH in resH
            @hour.push recH

所以我调用smth = new data()console.log smth并得到一个空属性和一个关于undefined没有'push'方法的错误。虽然我可以理解一个错误,但我无法理解为什么我的数组是空的。别误会我的意思 - 我知道这个错误导致它们是空的,但我尝试了几种变种。并且我已经阅读了关于acync和回调的信息,但仍然不知道如何使用回调来“警告”smth,而是在之后使用它。如果你可以帮助我或使用一些可能的链接 - 我会非常感激。

2 个答案:

答案 0 :(得分:0)

我假设您希望minutehour成为实例变量?它们必须在构造函数中初始化。你现在这样做的方式是prototype,所以它不能正常工作。试试这个:

class data
  constructor:    () ->
    @minute = []
    @hour = []
    findMin = events.find({"aggr":"minute"}).sort({$natural:-1}).limit(120)
    findHour = events.find({"aggr":"hour"}).sort({$natural:-1}).limit(14)
    findMin.execFind (errMin, resMin) =>
        for recMin in resMin
            @minute.push recMin
    findHour.execFind (errH, resH) =>
        for recH in resH
            @hour.push recH

答案 1 :(得分:0)

你有两个问题。导致您观察到的错误的是您的两个回调中的'@'未绑定到您的data实例,因此您需要使用=>。其次,正如@AaronDufour所指出的,你的hourminute数组在类级别声明,因此它们将在data的每个实例之间共享,我怀疑你是什么想要,所以你需要将它们移动到构造函数中。

class data
  constructor: () ->
    @minute = []
    @hour = []

    findMin = events.find({"aggr":"minute"}).sort({$natural:-1}).limit(120)
    findHour = events.find({"aggr":"hour"}).sort({$natural:-1}).limit(14)

    findMin.execFind (errMin, resMin) =>
      for recMin in resMin
        @minute.push recMin
    findHour.execFind (errH, resH) =>
      for recH in resH
        @hour.push recH