在返回之前将参数更新为 JavaScript 回调,而不使用全局变量
Updating parameters to JavaScript callback before it returns, without using globals
我正在努力对节点.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 请求。timeout 函数使用全局对象中的参数来调用外部函数,而不是设置时调用的参数。这样,它始终使用传递到外部函数的最新值,但不进行重复的 API 调用。
下面是如何使用全局变量实现此行为的简化示例:JSFiddle。点击运行几次,直到收到"失败响应",然后触发超时。
这有效,但如果有更好的方法,我宁愿不要将这些全局变量添加到模块中。
有没有办法获得相同的行为,但在不使用全局变量的情况下将所有状态封装在外部函数中?如果有人有想法,我也愿意完全重新思考我处理这个问题的方式。
如果不在
外部函数之外创建变量,您将无法执行此操作,但是仍然可以在不污染全局范围的情况下创建这些变量。
为此,请将外部函数包装在另一个立即执行的函数中,有时称为 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
相关文章:
- 使用Javascript中的回调处理变量分配
- 由于异步回调,变量被覆盖
- 带有全局变量、咖啡脚本和回调的模块 CSV
- YepNope/Modernizr 回调,包含全局 JavaScript 变量和 Internet Explorer
- 为什么在定义回调/侦听器函数(异步消息传递,port.on)后没有立即设置全局变量
- 回调中变量的范围
- 设置超时函数回调静态变量
- 如何将回调作为变量传递给预定义的回调
- Javascript 全局变量在回调函数之外不会保持不变
- Javascript 局部和全局变量在回调函数中失去作用域
- nodeJ的回调共享变量
- 通过回调更新全局变量
- Jquery回调函数变量总是本地的
- Javascript从另一个回调访问对象变量,而不将变量放在全局范围内
- jQuery事件回调和全局变量
- 保存回调中变量的值
- 访问传递给回调的变量
- 从回调传递变量到express路由器
- Javascript node.js回调函数变量作用域问题
- 回调设置变量晚于函数触发器