Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Meteor如何在第一个方法调用完成之前阻止它?_Meteor - Fatal编程技术网

Meteor如何在第一个方法调用完成之前阻止它?

Meteor如何在第一个方法调用完成之前阻止它?,meteor,Meteor,我有以下情况: 客户端有一个按钮,点击它将在服务器端执行Meteor.call方法,该方法将调用API并获取产品,在此期间,我不想禁用此按钮+阻止此方法再次执行基本上没有任何东西阻止您单击按钮100次,服务器将继续一次又一次地执行相同的方法 我的一些想法:使用会话禁用按钮(问题:仍然可以使用控制台Meteor.call并滥用它) 我还查看了Meteor.apply在文档中的wait:true似乎没有停止方法执行。老实说,我不知道这种事情是如何处理的 客户端: 'click .button-p

我有以下情况:

客户端有一个按钮,点击它将在服务器端执行
Meteor.call
方法,该方法将调用API并获取产品,在此期间,我不想禁用此按钮+阻止此方法再次执行基本上没有任何东西阻止您单击按钮100次,服务器将继续一次又一次地执行相同的方法

我的一些想法:使用会话禁用按钮(问题:仍然可以使用控制台Meteor.call并滥用它) 我还查看了Meteor.apply在文档中的
wait:true
似乎没有停止方法执行。老实说,我不知道这种事情是如何处理的

客户端:

  'click .button-products': function(e){
    Meteor.call('getActiveProducts', function(error, results){
      if (error)
        return Alerts.add(error.reason, 'danger', {autoHide: 5000});
      if (results.success)
        return Alerts.add('Finished Importing Products Successfully', 'success', {autoHide: 5000});
    })
  }
服务器端

Meteor.methods({
  getActiveProducts: function(){
    var user = Meteor.user();
    var api = api.forUser(user);

    importProducts = function(items){ 
      nextPage = items.pagination.next_page;
      items.results.forEach(function(product){ 
        var sameproduct = apiProducts.findOne({listing_id: product.listing_id}); 
        if (sameproduct) { 
          return;
        }
        var productExtend = _.extend(product, {userId: Meteor.userId()}); 
        apiProducts.insert(productExtend);
      });
    };

    var products = api.ProductsActive('GET', {includes: 'Images', limit: 1}); 
    importProducts(products);
    while (nextPage !== null) {
      products = api.ProductsActive('GET', {includes: 'Images', page: nextPage, limit: 1});
      importProducts(products);
   }
    return {success: true};
  }
});
:

在服务器上,来自给定客户机的方法一次运行一个。在第N次调用返回之前,客户端的第N+1次调用不会启动。但是,您可以通过调用
this.unblock
来更改此设置。这将允许第N+1次调用开始在新光纤中运行

这意味着对该方法的后续调用实际上并不知道它们是在第一个调用仍在运行时发出的,因为第一个调用已经完成运行。但你可以这样做:

Meteor.methods({
getActiveProducts:function(){
var currentUser=Meteor.users.findOne(this.userId);
if(currentUser&!currentUser.gettingProducts){
Meteor.users.update(this.userId,{$set:{gettingProducts:true}});
//让其他调用运行,但现在它们无法通过if块
这是unblock();
//在这里做你的实际方法
Meteor.users.update(this.userId,{$set:{gettingProducts:false});
}
}
});
现在,后续调用可能会在第一个仍在运行时运行,但它们不会在
if
块中运行任何内容。理论上,如果用户发送足够多的呼叫,第一个呼叫可能会在其他所有呼叫开始之前完成。但这至少应该大大限制用户可以发起的etsy调用的数量。您可以调整此技术以使其更加健壮,例如存储上次成功调用的时间并确保已过X秒,或者存储在过去一小时内调用该方法的次数并限制该次数,等等。

一段时间后可能会对您有用。本质上,它在服务器端公开会话api(因此得名),这意味着您可以在调用中执行类似于
ServerSession.set('doingSomethingImportant',true)
的操作,然后在后续调用中检查此会话的值。会话只能在服务器上设置,并在连接关闭时过期(因此他们可以发送垃圾邮件,但只能以刷新页面的速度进行)。
如果出现错误,您只需重置会话即可。也不应该有任何与意外错误相关的问题,因为会话将在连接关闭时过期。让我知道您的想法:)

我不太熟悉Meteor,但一般来说,您无法阻止服务器方法被调用(他们总是可以在控制台中执行)。您可以做的是,在输入
getActiveProducts
方法时,首先检查是否设置了指示用户已调用该函数的特定标志。如果已设置,则跳过函数的其余部分。如果未设置,则在返回之前设置并取消设置。@Gerrat如果meteor也是如此,我仍然不确定如何在服务器端启动检查,如果已执行但尚未完成,则跳过函数。另外,如果我有很多按钮/函数,我想可能会有一个类似的包,或者如果没有,我将不得不创建一个包来简化单行全局函数。如果抛出错误,这种方法会有问题,例如
Meteor。error
gettingProducts将保持为真,即使它不是真的在运行,它也会说它在运行!当然,我可以尝试用
Meteor.users.update(this.userId,{$set:{gettingProducts:false}})覆盖所有错误但是它有点容易出错,必须有更好的方法来检测它,或者这是最好的方法?您可以将任何可能在抛出/捕获中抛出错误的代码包装起来,然后从那里进行更新。或者只做X秒的方法,它不依赖于在方法完成后重置值。我肯定可以包装每个错误,但如果是意外错误,比如我自己的服务器崩溃,任何意外的事情都会导致X用户在他的收藏中被卡住,网站的可用性有限,所以我认为不是使用起来非常安全。备选案文2。X秒?我真的无法预测需要多长时间,即使我将其设置为X秒,我也会抛出一个错误。如果服务器没有用户授权的服务API,第一次调用将正确显示错误,但如果再次单击,则不会显示任何内容或错误,我认为涵盖所有内容太复杂了我已经开始查看meteor github文件中关于loggingIn()方法的设置为true/false我认为逻辑应该可以在这种情况下工作做这么简单的事情太复杂了。经过大量分析,就我的情况而言,最好通过删除它们来手动使用收集和覆盖错误。我在查找持久会话后实际上找到了您的包。我喜欢它,但想发布一个问题,以解决一些问题/可能的改进,并认为啊,可能我需要的不适合您的需要!你发现我的问题真的很有趣!:)我真的很喜欢它使用真正的收集,没有黑客攻击,它肯定是可靠的,我也喜欢你可以从服务器上的用户/设置读取会话。我不明白什么是连接?2个不同的选项卡=2个连接?页面刷新=连接关闭?如何克服pos机页面刷新问题