【问题标题】:Can't get query results outside the function无法获取函数外的查询结果
【发布时间】:2012-09-10 22:56:18
【问题描述】:

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

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 并得到一个空属性和一个关于未定义没有“推送”方法的错误。虽然我能理解一个错误,但我不明白为什么我的数组是空的。不要误会我的意思——我知道这个错误会导致它们为空,但我尝试了几种变体。我阅读了有关 acync 和回调的信息,但仍然不知道如何使用回调而不是“警报”,而是在之后使用它。如果您能帮助我或提供一些链接,我将非常感激。

【问题讨论】:

    标签: mongodb coffeescript mongoose


    【解决方案1】:

    你有两个问题。导致您观察到的错误的原因是两个回调中的“@”未绑定到您的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
    

    【讨论】:

    • 谢谢你们,问题出在这个“胖箭头”上
    【解决方案2】:

    我假设您希望 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
    

    【讨论】:

    • 感谢您的回答,但它没有用。关于使用未定义的推送,它会引发相同的错误。在那些 DB 函数中,'@minute' 和 '@hour' 似乎与那些函数相关,就像它们是本地的,而不是构造函数。
    • @Eshnelbek 检查我更新的代码。你需要一个粗箭头来保持正确的@
    猜你喜欢
    • 2013-12-07
    • 2015-07-26
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    相关资源
    最近更新 更多