我在Meteor.subscribeonReady
上的回调遇到了问题。当它被调用时,正如文档所述:订阅已被标记为完成。但是,它正在修改的集合可能无法处理上次订阅之间的差异。
通过修改 Todos 示例可以看到一个快速演示:
$ meteor create --example todos
编辑client/todos.js
,见第 34 行。将自动订阅块替换为:
Meteor.autosubscribe(function () {
var list_id = Session.get('list_id');
var onReady = function (done) {
var list, todos = Todos.find();
if (todos) {
list = todos.map(function (todo) {
return todo.text;
});
if (done) {
console.log("subscription onReady called again 100ms later:", list);
} else {
console.log("subscription onReady called:", list);
setTimeout(function () {
onReady(true);
}, 100);
}
}
};
if (list_id)
Meteor.subscribe('todos', list_id, onReady);
});
启动示例,然后在观察控制台的同时从一个待办事项列表单击到另一个(见左上角)。您会注意到,当onReady
被调用时,该集合包含来自前一个 Todo List 的文档与新选择的 Todo List 连接。
这并不是一个真正的错误,因为onReady
从来没有暗示它会在集合是最新的时被触发,但只有在订阅完成时才会触发。
有什么建议可以解决这个问题吗?订阅后收藏更新后,有没有办法立即通知?我想知道我是否应该依赖.observe
......但依赖客户端?那是可用的客户端吗?我明天可以试试这个……但我很想听听解决方案
仅供参考:我的用例围绕typeahead Bootstrap JS 插件展开。我正在向服务器发送带有搜索查询的订阅。服务器发布搜索结果,一旦客户端收到此数据(希望 onReady 将是正确的选择......),我将继续填充/更新 typeahead 源。