gpt4 book ai didi

函数内部的Javascript闭包不是 "remember",而是环境

转载 作者:行者123 更新时间:2023-12-03 08:41:54 25 4
gpt4 key购买 nike

我有一个函数,它从数据库检索数据并将其传递给回调。出于优化目的,我希望此数据最多每 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);
}
})();
}

我注意到,当我在我想要的函数中“构造”这个函数时(经常被调用),我基本上是在循环中创建一个闭包,因此它没有机会正常工作:

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

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

最佳答案

我认为您想要的是类似于您的原始代码:

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

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

那么你的更新函数将是:

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

也就是说,update是调用delayedUpdate返回的函数。当您调用update时,它将执行时间戳检查。

需要注意的一件事:如果没有该 server 对象的上下文,无论它是什么,都可能不喜欢调用该 getDbData 函数。如果是这样,那么设置应该如下所示:

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

关于函数内部的Javascript闭包不是 "remember",而是环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33025994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com