【问题标题】:setInterval with a variable interval具有可变间隔的 setInterval
【发布时间】:2014-04-03 23:53:58
【问题描述】:

我希望立即执行 api 调用,然后在 1 秒后,然后是 2 秒,以此类推,以 1 秒到 10 秒的增量递增。

我尝试过这样的事情:

Meteor.startup ->
  counter = 1000
  Meteor.setInterval (->
    Meteor.call "call_url", url, (err, result) ->
        ...

    if counter < 10000
      counter += 1000
      console.log counter
  ), counter

当我的计数器递增时,日志每秒钟准确一次,这意味着 setInterval 不会跟踪该值。

我认为处理此问题的唯一方法是让 9 个 setTimeout 在不同时间调用 api,然后在所有超时后启动一个 Meteor.setInterval .. . 听起来很丑。

关于如何以干净的方式执行此操作的任何建议?用户在刚连接到页面时看到频繁的更新很重要,但如果他决定让它打开一段时间,则不需要如此频繁地执行该 api 查询。

【问题讨论】:

    标签: coffeescript meteor settimeout setinterval


    【解决方案1】:

    一个更通用的解决方案(未来 CoinsManager 可扩展)是使用支持未来调度事件的队列包。看了一堆background task management for Meteorqueue支持调度。

    【讨论】:

    • 嗨,Dan,这看起来是个好主意,但更适合服务器调用。在这里,api调用全部完成on the client(取决于每个客户端可见地址,不保存任何东西在数据库中)。 dbarrett 建议我这样做:paste.ubuntu.com/7025613,也许通过检查窗口焦点让它更聪明
    【解决方案2】:

    不太清楚你在问什么,可能有很多方法可以生成你想要的间隔。

    在 javascript 中可能如下所示:

    var doStuff = function(){...};
    var intervals = [ 1000, 3000, 6000, 10000, 15000, 21000, 28000, 36000, 45000, 55000 ];
    
    doStuff();  //run immediately
    intervals.forEach( function( interval ){
      Meteor.setTimeout( doStuff, interval );
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-15
      • 2012-12-11
      • 2021-01-22
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多