是否有可能在Meteor的observe
回调中调用服务器方法?
我汇总了一个重现问题的示例,即Meteor.call()
的回调中调用的myCursor.observe()
不会执行。从observe回调中调用时,Meteor.method
本身也不会回调错误,只返回Undefined
。
停止忽略我,Meteor.call()
:)非常感谢任何帮助!
observe.js
items=new Meteor.Collection("Items");
if (Meteor.isClient) {
Meteor.subscribe("Items");
Meteor.startup(function(){
itemsCursor=items.find();
itemsHandle=itemsCursor.observe({
added : function(doc){
console.log("added "+doc.text);
Meteor.call('aMethod',doc.text,function(e,r){
if(e){
console.log("error from server: "+e);
}else{
console.log("response from server: "+r);
}
});
},
removed : function(doc){
console.log("removed "+doc.text);
Meteor.call('aMethod',doc.text,function(e,r){
if(e){
console.log("error from server: "+e);
}else{
console.log("response from server: "+r);
}
});
}
});
});
Template.test.items=function(){
return items.find();
}
Template.test.events({
'click #add':function(){
items.insert({"text":"Timestamp: "+(new Date().getTime())});
},
'click #remove':function(){
items.remove(items.findOne()._id);
}
});
}
if (Meteor.isServer) {
Meteor.publish("Items",function(){
return items.find();
});
items.allow({
insert : function(userId,doc){
return true;
},
update : function(userId,doc){
return true;
},
remove : function(userId,doc){
return true;
}
});
Meteor.methods({
aMethod:function(text){
console.log("Got it! "+text);
return "Got it! "+text;
}
});
}
observe.html
<head>
<title>observe</title>
</head>
<body>
{{> test}}
</body>
<template name="test">
<button id="add">add item</button>
<button id="remove">remove item</button>
<ol>
{{#each items}}
<li>{{text}}</li>
{{/each}}
</ol>
</template>
答案 0 :(得分:6)
这可能是一个已知问题,我不确定,因为我自己没有尝试过,但看起来可能有一种解决方法(参见https://github.com/meteor/meteor/issues/907)
将Meteor.call
添加到即时的setTimeout回调中:
added: function(doc) {
console.log("added "+doc.text);
setTimeout(function() {
Meteor.call('aMethod',doc.text,function(e,r){
if(e){
console.log("error from server: "+e);
}else{
console.log("response from server: "+r);
}
});
},0);
}
答案 1 :(得分:0)
从客户端方法调用时,btw Tarang's answer也可以正常工作。基本上我在客户端范围内有一个文件。这个文件是一个方法定义。在我的方法定义中,我在服务器上调用一个方法。
我遇到了问题,因为只调用了服务器调用的客户端存根,并且没有调用服务器方法。修复就是这个:
Meteor.methods({
assignUserSession: function(options) {
setTimeout(function() { // https://stackoverflow.com/questions/18645334/meteor-meteor-call-from-within-observe-callback-does-not-execute
// Find all the base_accounts of this user and from there decide which view to prioritize.
Meteor.call('user_base_accounts', {user_id: Meteor.userId()}, function(error,result){
....
//server is then called due to logs shown in the command prompt
....
});
});
}
});
感谢您指出这一点!