【问题标题】:javascript callback after the interval has executed间隔执行后的javascript回调
【发布时间】:2016-04-26 09:11:13
【问题描述】:

我正在使用自定义间隔函数来确保函数执行首先完成,直到下一次运行。一般来说,我会执行以下操作,我会检查 redis 数据库并检查作业是否由 sidekiq 执行。如果它被执行,我会向数据库发出请求以获取已写入的信息,如果在第 10 次之后没有我解析未定义的数据,我会运行此函数 10 次。我想知道我现在的解决方案是否可以改进。

 const interval = (func, wait, times) => {
    const interv = function(w, t){
      return () => {
        if (typeof t === 'undefined' || t-- > 0) {
          setTimeout(interv, w);
          try {
            func.call(null);
          }
          catch (e) {
            t = 0;
            throw e.toString();
          }
        }
      };
    }(wait, times);
    setTimeout(interv, wait);
  };

    let intervalCount = 0;
    interval(() => {
      intervalCount++;
      redisClient.lrange('queue:default', 0, -1, (err, results) => {
        const job = results.find((element) => { return JSON.parse(element).jid === jobId; });
        if (job === undefined) {
          checkDatabase(personId).then((result) => {
            if (result) {
              resolve(checkDatabase(personId));
            } else if (intervalCount >= 10) {
              resolve(undefined);
            }
          });
        }
      });
    }, 1500, 10);

【问题讨论】:

  • 您可以通过将else 添加到if (typeof t === 'undefined' || t-- > 0) 来制作“done()”
  • @BenjaminGruenbaum resolve is 'bluebird' promise 我没有将它包含在此代码 sn-p 中。
  • @dandavis 这是个好主意,我会试一试。我只想删除计数器 else 块if (intervalCount >= 10) { resolve(undefined); }
  • @IliaAptsiauri 承诺是一次性的,他们会得到解决一次
  • 好的,我会写一个答案。

标签: javascript asynchronous promise bluebird


【解决方案1】:

好吧,您使用的是现代 NodeJS,并且您提到您使用的是 Promise 和 bluebird,所以让我们使用使用生成器和 bluebird 的现代解决方案。

您根本不应该经常使用 Promise 构造函数。您可以承诺 redis API 并让您的生活更轻松:

Promise.promisifyAll(require("redis")); // now redis is promisified


var pollAndResolve = Promise.coroutine(function* pollAndResolve () {
    for(var i = 0; i < 10; i++) {
       yield Promise.delay(1500); // wait 1500 ms
       yield redisClient.lrangeAsync('queue:default', 0, -1); // since we promisifed
       const job = results.find((element) => JSON.parse(element).jid === jobId);
       if (result) return yield checkDatabase(personId);
    }
});

【讨论】:

猜你喜欢
  • 2013-03-28
  • 2010-12-20
  • 2017-07-29
  • 2012-05-09
  • 2020-01-22
  • 2010-11-12
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多