gpt4 book ai didi

node.js - 如何缓存要在异步 NodeJS 调用内部使用的外部范围值?

转载 作者:可可西里 更新时间:2023-11-01 11:36:18 25 4
gpt4 key购买 nike

类似下面的代码说明了我的意图,如果你能想象一个天真的程序员第一次可能会如何尝试编写它:

function (redisUpdatesHash) {
var redisKeys = Object.keys(redisUpdatesHash);
for (var i = 0; i < redisKeys.length; i++) {
var key = redisKeys[i];
redisClient.get(key, function (err, value) {
if (value != redisUpdatesHash[key]) {
redisClient.set(key, redisUpdatesHash[key]);
redisClient.publish(key + "/notifications", redisUpdatesHash[key]);
}
});
}
}

问题是,可以预见,key 是 node_redis 回调的异步性质的回调范围内的错误值。检测方法非常原始,因为我无法控制安全限制 - 所以我唯一的选择是求助于轮询源的状态。所以上面的意图是将该状态存储在 Redis 中,以便我可以在下一次轮询时进行比较以确定它是否发生了变化。如果有,我发布一个事件并存储新值以更新下一个轮询周期的比较值。

似乎在 NodeJS 中没有好的方法来做这件事...我愿意接受任何建议——无论是修复上面的代码以某种方式能够执行这个检查,还是建议一个不同的方法来做这个完全。

最佳答案

我通过使用函数柯里化(Currying)在闭包中缓存外部值解决了这个问题。

在原生 Javascript/NodeJS 中

asyncCallback = function (newValue, redisKey, redisValue) {
if (newValue != redisValue) {
redisClient.set(redisKey, newValue, handleRedisError);
redisClient.publish(redisKey + '/notifier', newValue, handleRedisError);
}
};

curriedAsyncCallback = function (newValue) {
return function (redisKey) {
return function (redisValue) {
asyncCallback(newValue, redisKey, redisValue);
};
};
};

var newResults = getNewResults(),
redisKeys = Object.keys(newResults);

for (var i = 0; i < redisKeys.length; i++) {
redisClient.get(redisKeys[i], curriedAsyncCallback(newResults[redisKeys[i]])(redisKeys[i]));
}

但是,我最终使用 HighlandJS 来帮助柯里化(Currying)和迭代。

var _ = require('highland'),
//...

asyncCallback = function (newValue, redisKey, redisValue) {
if (newValue != redisValue) {
redisClient.set(redisKey, newValue, handleRedisError);
redisClient.publish(redisKey + '/notifier', newValue, handleRedisError);
}
};

var newResults = getNewResults(),
redisKeys = Object.keys(newResults),
curriedAsyncCallback = _.curry(asyncCallback),
redisGet = _(redisClient.get.bind(redisClient));

redisKeys.each(function (key) {
redisGet(key).each(curriedAsyncCallback(newResults[key], key));
});

关于node.js - 如何缓存要在异步 NodeJS 调用内部使用的外部范围值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33133710/

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