微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – Meteor:来自observe回调内的Meteor.call()不会执行

是否有可能从Meteor的观察回调中调用服务器方法

我把一个重现问题的例子放在一起,在myCursor.observe()的回调中调用的Meteor.call()不会执行.当从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>

解决方法:

这可能是一个已知的问题,我不确定,因为我自己没有尝试过,但看起来可能有一个解决方法(见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);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐