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

Updating parameters to JavaScript callback before it returns, without using globals

本文关键字:回调 全局变量 JavaScript 返回 更新 参数      更新时间:2023-09-26

我正在努力对节点.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