【问题标题】:Meteor call in a loop. How to prevent multiple call?Meteor 循环调用。如何防止多次调用?
【发布时间】:2019-08-04 21:43:33
【问题描述】:

方法调用“插入所有短信数据”运行不止一次我试图阻止使用计数器变量,但在客户端它运行一次,在服务器端它运行 x 次,如图所示,从而将数据添加到 db我不想要的多个时间,这应该只添加到数据库一次。我还想在方法调用“插入所有短信数据”中添加另一个调用,它应该将 x 作为循环运行。我卡在这里。 流星1.8反应16.8

imports/api/kuser.js

'Find all numbers' (smsText) {
        if(!this.userId) {
            throw new Meteor.Error('not-authorized');
         }
         let counter = 0;
          return userKisandb.find({
            userId: this.userId
         }).fetch().map((Mob) => {
            // return Mob.Mnumber
            if(Mob.Mnumber) {

                Meteor.call('Send to all',Mob.Mnumber,smsText,(err,resp) => {
                  //sms.js
                  if(err){
                      console.log("send all numbers error2", err);
                    } else {
                      console.log("send all numbers ", resp);

                      if(counter === 0) {
                        Meteor.call('Insert All sms data',smsText,counter,(err,resp1) => {
                          //get inserted data id
                          //allSmsdb
                          if(err){
                              console.log("Insert All sms data error", err);
                            } else {
                              console.log("this should run only once ",counter);

                  //Another call to be added which should run x times
                            }
                          })
                          counter++
                        }

                    }

                  });

            } //Mob.Mnumber

         });
    },

方法一是

'Send to all'(mob,text) {
      return "sucess";
  },

方法2是

'Insert All sms data' (smstext,counter) {
        if(!this.userId) {
            throw new Meteor.Error('not-authorized');
         }
         console.log("Inserted same data x times",counter);
         if(counter === 0) {
            return allSms.insert({
                smstext,
                userId: this.userId,
                updatedAt: moment().valueOf(),
            });
         }

    },

输出是

【问题讨论】:

    标签: reactjs meteor


    【解决方案1】:

    可以从前端调用 Meteor 方法,要求后端做一些事情。后端方法执行Meteor.call 没有意义,因为它已经在后端。它会起作用,但你会遇到麻烦,因为你的计数器没有像你期望的那样传递。

    让你的方法只在服务器上工作,只循环数据,做所有的工作,而不是像你一样把它分解成碎片。

    【讨论】:

    • 有多个数据库集合,这就是我在这里使用调用的原因,我不想在这里导入,我会尝试另一种方式或通过导入。感谢您指出这种情况。
    • 导入比Meteor.call()便宜得多。如果您不想将集合导入此脚本,您可以将代码放在一个简单的实用程序函数中,导入并调用它(没有Meteor.call() 的开销
    猜你喜欢
    • 2018-04-12
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多