Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.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
Javascript 如何同时模拟多个慢速流星出版物?_Javascript_Meteor_Publish Subscribe - Fatal编程技术网

Javascript 如何同时模拟多个慢速流星出版物?

Javascript 如何同时模拟多个慢速流星出版物?,javascript,meteor,publish-subscribe,Javascript,Meteor,Publish Subscribe,我想模拟多个慢速订阅。客户端同时订阅两个或多个出版物,结果将在稍后到达。 我们的目标是能够看到网络延迟和随机性如何影响我的应用程序(它有缺陷,因为我希望一份出版物在另一份之前准备好,…) 对出版物使用以下简短设置: // server/foo.js Meteor.publish('foo', function() { console.log('publishing foo'); Meteor._sleepForMs(2000); console.log('waking up foo'

我想模拟多个慢速订阅。客户端同时订阅两个或多个出版物,结果将在稍后到达。
我们的目标是能够看到网络延迟和随机性如何影响我的应用程序(它有缺陷,因为我希望一份出版物在另一份之前准备好,…)

对出版物使用以下简短设置:

// server/foo.js
Meteor.publish('foo', function() {
  console.log('publishing foo');
  Meteor._sleepForMs(2000);
  console.log('waking up foo');
  this.ready();
});

// server/bar.js is the same with a different name
Meteor.publish('bar', function() {
  console.log('publishing bar');
  Meteor._sleepForMs(2000);
  console.log('waking up bar');
  this.ready();
});
由于Meteor的出现,这两种出版物的发行速度都减慢了

然后,客户端订阅每个发布:

Meteor.subscribe('bar'); // /client/bar.js
Meteor.subscribe('foo'); // /client/foo.js
在那里,我希望首先看到两个
“发布”
日志,然后看到两个
“唤醒”

但是,这会出现在控制台中:

15:37:45?发布栏
15:37:47? 唤醒酒吧
15:37:47? 发布foo
15:37:49? 醒醒福

(我去掉了一些不相关的绒毛,比如白天)

很明显,它是以同步方式运行的。我认为有两件事会导致这种情况:服务器
waitForMs
,它会完全阻塞服务器(相当奇怪),或者客户端订阅设计

为了确保不是服务器,我添加了一个简单的心跳:
Meteor.setInterval(函数(){console.log('beep');},500)

而且它没有停止嘟嘟声,因此服务器没有完全被阻止

因此,我怀疑问题在于客户端订阅模型,它可能会在调用另一个订阅之前等待订阅准备就绪

因此,有两个问题:

  • 为什么我的实验没有按我希望的方式进行
  • 我应该如何修改它以实现我的预期目标(多个慢速出版物)

    • 我认为这是因为出版物被封锁了

      您可以使用MeteoHacks:unblock取消阻止发布:


      最好在每次发布开始时使用此.unblock()(添加meteorhacks后:unblock)。

      Meteor按顺序处理DDP消息(包括订阅)。这确保了您可以执行一些操作,例如删除对象,然后按正确的顺序将其插入,而不会出现任何错误

      在Meteor.methods中,支持使用
      this.unblock()
      绕过此问题,以允许处理下一个可用的DDP消息,而无需等待前一个消息完成执行。不幸的是,这不适用于流星。在流星核心中发布。您可以在此处看到有关此问题的讨论(以及一些解决方法):

      还有一个软件包将此功能添加到出版物中:

      // server/foo.js
      Meteor.publish('foo', function() {
        console.log('publishing foo');
        Meteor._sleepForMs(2000);
        console.log('waking up foo');
        this.ready();
      });
      
      // server/bar.js is the same with a different name
      Meteor.publish('bar', function() {
        console.log('publishing bar');
        Meteor._sleepForMs(2000);
        console.log('waking up bar');
        this.ready();
      });
      

      为什么我的实验没有按我希望的方式进行

      Meteor.\u sleepForMs
      正在阻止它:

      调用它会阻止下一行在光纤内执行,直到持续时间结束。但是,由于光纤的工作方式,这不会阻止节点服务器处理其他事件(即执行另一个发布)

      以下是关于Meteor中纤维的讨论:

      我应该如何修改它以实现我的预期目标(多个慢速出版物)

      尝试使用Meteor.setTimeout来异步模拟延迟

      Meteor.publish('foo', function() {
        console.log('publishing foo');
      
        var self = this;
      
        Meteor.setTimeout(function () {
          console.log('waking up foo');
          self.ready();
        }, 2000);
      });
      

      流星黑客:解锁是为了出版物