【问题标题】:AngularJS API call inside getter functiongetter函数内部的AngularJS API调用
【发布时间】:2019-08-13 16:02:28
【问题描述】:

我在 AngularJS 中继承了一个项目,但存在一些结构性问题。它使用 API 调用从端点获取一些设置,但有时应用程序会在这些设置加载之前尝试使用这些设置,从而导致“未定义”错误。

我试图通过使用 getter 来解决这个问题。这个想法是,当某些方法访问设置对象时,它会检查它们是否已经加载,如果没有,则从 API 中获取它们。

一段时间后我已经让它工作了,但是这个想法有问题。当多个方法同时访问设置时(加载页面时),API 将被多次调用,因为第一次调用尚未返回以覆盖内部 _settings

    vm._settings  = null;
    Object.defineProperty(vm,'settings',{get: function(){
      if(vm._settings == null){
        settings_service.get().$promise.then(function success(response) {
          vm._settings = response;
          console.log(vm._settings);
          console.log("returning in");
          return vm._settings;
        }, function error(err) {
          handle_api_error(ngNotify, err);
        });  
      }
      else return vm._settings;
    }});

我想不出一种方法让其他尝试执行 getter 等到第一个调用返回并改用该结果。我不确定我是否应该使用 await、promises 或其他东西。提前致谢

【问题讨论】:

    标签: javascript angularjs angular-promise


    【解决方案1】:

    您想消除这些请求。您可以使用现有的库或只实现自己的库。

    app.factory('debounce', function($timeout) {
        return function(callback, interval) {
            var timeout = null;
            return function() {
                $timeout.cancel(timeout);
                timeout = $timeout(function () { 
                    callback.apply(this, args); 
                }, interval);
            };
        }; 
    });
    

    【讨论】:

    • 您好,感谢您的建议。 ng-debounce-throttle 已经在其他地方使用,所以我决定使用那个。它按预期阻止了 API 调用的泛滥,但设置对象现在再次返回未定义,所以我有点困惑。 var something = crtl.settings.something 说它无法读取未定义的内容。 debounce 不应该支持这一点吗?
    • 问题似乎是 this 未定义。我会看看我是否可以在 debounce 函数中手动传递正确的上下文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    相关资源
    最近更新 更多