在返回之前将参数更新为JavaScriptcallback,而不使用全局variables

我正在修改node.js模块来改进我的用例之一的error handling。 这个模块的细节并不真正相关,但是我想要做的事情之一就是当从一个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请求,但是我希望在超时结束时使用最近调用的参数。

我已经能够使用模块全局variables来获得这个工作。 每次新的调用进入外部函数时,它都会使用新参数更新一个全局对象,如果超时未决,则返回而不调用API请求。 超时函数使用全局对象中的参数来调用外部函数,而不是从设置时调用参数。 这样,它总是使用传入外部函数的最新值,但不会重复API调用。

下面是我用全局variables实现这个行为的一个简单例子: JSFiddle 。 点击运行几次,直到你得到一个“失败响应”,然后触发超时。

这有效,但如果有更好的方法,我不希望将这些全局variables添加到模块中。

有没有办法得到这个相同的行为,但没有使用全局封装在外部函数的所有状态? 如果任何人有想法,我也可以完全反思我处理这个问题的方式。

如果不在外部函数之外创buildvariables,您将无法做到这一点,但是仍然可以创build这些variables而不会污染您的全局范围。

要做到这一点,将你的外部函数包装在另一个立即执行的函数中,有时称为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