在返回之前将参数更新为JavaScript回调,而不使用全局变量

时间:2015-06-19 16:00:45

标签: javascript node.js

我正在修改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。命中运行几次,直到您收到“失败响应”,然后触发超时。

这样可行,但如果有更好的方法,我宁愿不将这些全局变量添加到模块中。

有没有办法获得相同的行为,但是在不使用全局变量的情况下将所有状态封装在外部函数中?我也愿意完全重新思考我处理这个问题的方法任何人都有想法。

1 个答案:

答案 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