函数内的Javascript闭包并不记得"它的环境

时间:2015-10-08 21:09:37

标签: javascript loops asynchronous closures

我有一个函数,它从数据库中检索数据并将其传递给回调。出于优化目的,我希望此数据每60秒最多更新一次。我的闭包函数如下:

function delayedUpdate(fn, delay, callback) {
  var nextCall = Date.now();
  var data = false;

  (function () {
    if (nextCall <= Date.now()) {
      nextCall = Date.now() + delay;
      fn(function (err, res) {
        data = err ? false : res;
        callback(err, data);
      });
    } else {
      callback(null, data);
    }
  })();
}

我注意到当我&#34;构建&#34;这个功能在我想要的功能中,我经常被称为基本上在循环中创建一个闭包,所以它没有机会正常工作:

function update()
{
  delayedUpdate(server.getDbData, 60000, function (err, data) {
    someDataToRender = data;
  });
}

delayedUpdate包含在其他功能中并分配给变量也不起作用。我怎样才能实现目标?我知道这可能是一个愚蠢的问题,但我还在学习。

2 个答案:

答案 0 :(得分:1)

我认为您想要的就像您的原始代码:

update

然后您的var update = delayedUpdate((server.getDbData, 60000, function (err, data) { someDataToRender = data; }); 功能将是:

update

也就是说,delayedUpdate是从调用update返回的函数。当您致电getDbData时,它会执行该时间戳检查。

有一点需要注意:server函数可能不喜欢在没有var update = delayedUpdate((server.getDbData.bind(server), 60000, function (err, data) { someDataToRender = data; }); 对象的上下文的情况下被调用,无论它是什么。如果是这样,那么设置应如下所示:

repaint()

答案 1 :(得分:0)

你的代码很好。您只需要在函数外声明变量nextCalldata

var nextCall = Date.now();
var data = false;

function delayedUpdate(fn, delay, callback) {

    if (nextCall <= Date.now()) {

        nextCall = Date.now() + delay;

        fn(function (err, res) {
            data = err ? false : res;
            callback(err, data);
        });
    } else {
        callback(null, data);
    }
}