我有一个函数,它从数据库中检索数据并将其传递给回调。出于优化目的,我希望此数据每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
包含在其他功能中并分配给变量也不起作用。我怎样才能实现目标?我知道这可能是一个愚蠢的问题,但我还在学习。
答案 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)
你的代码很好。您只需要在函数外声明变量nextCall
和data
:
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);
}
}