Meteor 1.6可以同时调用客户端和服务器端

时间:2018-05-31 13:25:21

标签: javascript meteor

我目前正在开发一个收集管理器,它也管理外键。 它还会生成一些表单,我会检查外键并获得正确的回调函数。

我正在使用meteor的wrapAsync方法,以便使用方法调用的同步版本。

首先,我在“check fk”方法中声明同步调用函数。

declareCheckFKMethod(index){
        Meteor.methods({
             [this._collectionList[index]._prefix.replace(/\//g,"")+this._checkFKSuffix]:(fk)=>{
                var syncFunc = Meteor.wrapAsync(this.checkFKInDB.bind(this));
                return syncFunc(fk,index)
            }
        })
    }

这是目标函数:

checkFKInDB(fk,collectionIndex,callBack){
        try{
           var test = this._collectionList[collectionIndex].find({_id:fk}).fetch();
           if(test.length==1){
               return callBack(null,true);
           }
           else{
               return callBack(null,false);
           }
        }
        catch(e){
            return callBack(new Meteor.Error("DB error", e.message),null)
        }
    }

然后在我的插入函数中,我检查客户端和服务器端的所有FK字段:

const check = Meteor.call(this._collectionList[index]._prefix.replace(/\//g,"")+this._checkFKSuffix,document[element.entryName]);
console.log(check)

这是我在插入有效文档时得到的结果:

服务器端控制台日志:true

客户端控制台日志:未定义

我怀疑客户端不是在等待回调,而是服务器。 我怎么能解决这个问题? (顺便说一句,我试过等待/异步关键字,但它只是给我错误......)

2 个答案:

答案 0 :(得分:0)

您的客户端功能始终需要to pass a callback才能收到异步结果:

Meteor.call(this._collectionList[index]._prefix.replace(/\//g,"")+this._checkFKSuffix,document[element.entryName], (err, check) => {
  console.log(err, check);
});

编辑:对于您的通知,Meteor方法将解析方法Promise样式中的值(了解有关Fibers如何工作的更多信息),而客户端将始终以回调样式接收结果或错误。因此,在调用方法时在客户端上使用某种异步/等待样式模式的想法可能不会那样。

答案 1 :(得分:0)

我实际上找到了一个解决方案,但我不确定它为什么会起作用,如果有人能够清楚地解释:

我只需要制作一个“checkFKInDB”服务器和客户端函数,如下所示:

checkFKInDB(fk,collectionIndex,callBack){
    if(Meteor.isClient){
        try{
           var test = this._collectionList[collectionIndex].find({_id:fk}).fetch();
           if(test.length==1){
               return true;
           }
           else{
               return false;
           }
        }
        catch(e){
            throw new Meteor.Error("DB error", e.message);
        }
    }
    if(Meteor.isServer){
        try{
           var test = this._collectionList[collectionIndex].find({_id:fk}).fetch();
           if(test.length==1){
               return callBack(null,true);
           }
           else{
               return callBack(null,false);
           }
        }
        catch(e){
            throw new Meteor.Error("DB error", e.message)
        }
    }
}

然后:

try{

      test = Meteor.call(this._collectionList[index]._prefix.replace(/\//g,"")+this._checkFKSuffix,document[element.entryName]);
}
catch(e){
      throw new Meteor.Error("DB error",e.message)
}

如果有人能解释为什么在服务器端需要回调而在客户端不需要回调那么好!