我正在修改node.js模块,以改善我的一个用例的错误处理。模块的细节并不真正相关,但我想要做的事情之一是在从API请求的响应中接收到某个状态代码时触发延迟重试。为此,我使用timeOut函数在一段时间后触发对函数的新调用。
代码的结构如下所示:
Outer function (parameters specified by client application)
——API request (using parameters)
——Callback from API request (response with status code)
——If error, set timeout to call outer function after delay
但是,我还想处理在等待超时时再次调用外部函数的情况。我不希望任何调用在超时挂起时触发新的API请求,但我做希望在超时时使用最近一次调用的参数饰面。
我已经能够使用模块的全局变量来实现这一点。每次新调用进入外部函数时,它都会使用新参数更新全局对象,如果超时处于挂起状态,则返回而不调用API请求。超时函数使用全局对象中的参数来调用外部函数,而不是调用它时的参数。这样它总是使用传递给外部函数的最新值,但不会进行重复的API调用。
以下是我如何使用全局变量实现此行为的简化示例:JSFiddle。命中运行几次,直到您收到“失败响应”,然后触发超时。
这样可行,但如果有更好的方法,我宁愿不将这些全局变量添加到模块中。
有没有办法获得相同的行为,但是在不使用全局变量的情况下将所有状态封装在外部函数中?我也愿意完全重新思考我处理这个问题的方法任何人都有想法。
答案 0 :(得分:1)
如果不在外部函数之外创建变量,您将无法执行此操作,但仍可以创建这些变量而不会污染全局范围。
为此,将外部函数包装在另一个立即执行的函数中,有时称为IIFE:
mainFunction: (function() {
var savedParam1;
var savedParam2;
var savedParam3;
var pendingTimeout = false;
return function(param1, param2, param3) {
savedParam1 = param1;
savedParam2 = param2;
savedParam3 = param3;
if (pendingTimeout) {
log('pending timeout -- ignoring new call');
return;
}
/* and so on */
}
})(); // the () causes the outer function to run immediately,
// which creates a scope for the savedParam / pendingTimeout variables,
// and then returns the inner function (your old outer function)
// to be used for mainFunction