当光标未准备好时,将调用订阅的onReady

时间:2014-06-08 06:36:24

标签: coffeescript meteor

我正在将一些非游标文本数据从Meteor服务器发布到订阅该数据的Meteor客户端。客户端的订阅位于Deps.autorun函数中,并且当因变量发生更改时,将成功调用订阅。

但是,我想在文本数据进入后立即解析它,所以我想我会在订阅的onReady函数中执行此操作。这在第一次发送数据时工作正常,但在随后发布不同数据时,onReady函数仍然使用以前的数据。

我想知道如何在数据完全通过后解析数据?

请参阅下面的代码&输出示例: (为了完整性:我在Windows 8.1上使用Meteor 0.8.1.3,客户端是Chrome 35)

客户端:

cursor = new Meteor.Collection "data"

reactiveInput = 0
dep = new Deps.Dependency

window.setReactiveInput = (newVal) ->
  dep.changed()
  reactiveInput = newVal

getReactiveInput = ->
  dep.depend()
  reactiveInput

Deps.autorun ->
  Meteor.subscribe "loadData", getReactiveInput(), (r) ->
    console.log "data ready"
    for o, i in cursor.find().fetch()
      console.log i, o.value
    # Returns correct data on first call
    # Returns original data on second call
    # Returns second data on third call, etc...

服务器:

Meteor.publish "loadData", (input) ->
  time = Date.now()
  for x in [0..parseInt(input)]
    @added "data", x, {value: time}
  @ready()

示例输出:

data ready
0 1402208546540 

> setReactiveInput(1)
1
data ready
0 1402208546540
1 1402208551687 

> setReactiveInput(2)
2
data ready
0 1402208551687
1 1402208551687
2 1402208553949 

2 个答案:

答案 0 :(得分:0)

由于我不需要实际的游标数据,我想我可以简单地调用Meteor方法来获取所需的数据。但是,我仍然认为光标的数据在原始情况下没有正确更新是很奇怪的。

解决方案:

客户端:

Deps.autorun ->
  Meteor.call "loadData", getReactiveInput(), (e, result) ->
    console.log "data ready"
    for o, i in result
      console.log i, o.value

服务器:

Meteor.methods
  loadData: (input) ->
    result = []
    time = Date.now()
    for x in [0..parseInt(input)]
      result.push {value: time}
    return result

答案 1 :(得分:0)

以下是可以解释您的问题:

onReady中,预期的行为是使用添加的记录来查看客户端数据,而不是已删除的记录。完整的解释是here

以下是一种解决方法:在访问数据之前稍等一下,以便解决订阅取消。

Tracker.autorun(function()  {   
    Meteor.subscribe('myCollection', Session.equals('whatever', true), function onReady() {
        Meteor.setTimeout(function() {
            console.log(MyCollection.find({}).fetch());     
        }, 0);
    });
});