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);
});
流星黑客:解锁是为了出版物