有没有一种简单的方法来模拟Meteor的滞后?

时间:2013-04-30 07:53:21

标签: meteor

有没有办法用Meteor模拟滞后?或许可以延迟所有通话的东西,比如300毫秒?

4 个答案:

答案 0 :(得分:8)

您可以使用以下代码publish执行此操作:

Meteor._sleepForMs(5000); // sleeps for 5 seconds

答案 1 :(得分:4)

我想我的派对有点晚了,但这是一个更好的解决方案:

这个问题基本上有两个部分。一个是,如何延迟Meteor WebSocket(SockJS)写入,一个是如何延迟HTTP流量(connect)。您需要将以下两个片段添加到服务器端代码中,以便延迟从Meteor服务器发送的所有流量。

的WebSocket

困难的部分是覆盖了WebSocket write以使用setTimeout延迟它:

(function () {
  // Set the delay you want
  var timeout = 3000
  // stream_server abstracts sockJS the DDP-Server talks to it. 
  var streamServer = Meteor.server.stream_server
  // The connect event listener
  var standardConnect = streamServer.server._events.connection

  // Overwrite the default event-handler
  streamServer.server._events.connection = function (socket) {
    // Overwrite the writes to the socket
    var write = socket.write
    socket.write = function () {
      var self = this
      var args = arguments
      // Add a delay
      setTimeout(function () {
        // Call the normal write methods with the arguments passed to this call
        write.apply(self, args)
      }, timeout)
    }
    // Call the normal handler after overwritting the socket.write function
    standardConnect.apply(this, arguments)
  }
})()

HTTP

使用connect非常直接:

// Add a simple connect handler, wich calls the next handler after a delay
WebApp.rawConnectHandlers.use(function (req, res, next) {
  return setTimeout(next, timeout)
})

答案 2 :(得分:1)

不确定所有来电,但您可以使用Futures在服务器上添加延迟,这样您就可以看到延迟补偿的实际效果。

例如,在流星方法中,您可以

Meteor.methods({
  post: function(post) {
    post.title = post.title + (this.isSimulation ? '(client)' : '(server)');

    // wait for 5 seconds
    if (! this.isSimulation) {
      var Future = Npm.require('fibers/future');
      var future = new Future();
      Meteor.setTimeout(function() {
        future.ret();
      }, 5 * 1000); // 5 seconds
      future.wait();
    }
    var postId = Posts.insert(post);
    return postId;
  }
});

这将显示插入的帖子(客户端)附加到结尾,然后5秒后将从服务器获得更新,帖子的标题将以(服务器)结束

答案 3 :(得分:0)

如果您想模拟订阅中的延迟,您可以执行下一步:

Meteor.publish('collection', function(params) {
  Meteor._sleepForMs(2000); // Sleep for 2 seconds    
  return CollectionX.find(params.query,params.projection);
});