我正在将一些非游标文本数据从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
答案 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);
});
});