You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular应用加载两个服务时崩溃:仅单个服务可正常运行

问题根源:重复创建Angular模块导致覆盖

嘿,这问题其实挺典型的!你遇到的情况核心原因是两个服务都在重复创建同一个Angular模块,后加载的服务直接把先加载的模块给覆盖了,自然只能留下最后生效的那个服务。

你看两个服务的代码开头,都写了:

angular.module('nutricia.services', [])

这里的第二个参数[]是在告诉Angular:「帮我创建一个全新的nutricia.services模块,它没有依赖」。所以当第二个服务加载时,它会把第一个已经创建好的nutricia.services模块完全替换掉,最终就只能有一个服务能正常工作。

解决方案:获取已存在的模块,而非重复创建

只需要把第二个服务里的模块声明改成不带第二个参数的形式,这样Angular就会去获取已经存在的nutricia.services模块,而不是重新创建:

修改后的KwaaltjestestService代码

(function() { 
  'use strict'; 
  // 去掉[],获取已存在的nutricia.services模块
  angular.module('nutricia.services') 
    .service('KwaaltjestestService', function($http, $q) { 
      var getKwaaltjes = function (params) { 
        var deferred = $q.defer(); 
        $http({ 
          method: 'GET', 
          url: 'https://www.nutriciavoorjou.nl/mvc/allergytest/' + params 
        }).then(function successCallback(response) { 
          deferred.resolve(response.data); 
        }, function errorCallback(response) { 
          // 建议这里补充错误处理,比如deferred.reject(response),方便调用方捕获异常
        }); 
        return deferred.promise; 
      }; 
      return { getKwaaltjes: getKwaaltjes }; 
    }) 
})();

第一个服务代码保持不变

它是第一个创建nutricia.services模块的,带[]的写法没问题:

(function() { 
  'use strict'; 
  // 带[]表示创建新模块,作为模块的初始化声明
  angular.module('nutricia.services', []) 
    .service('LoginService', function($http) { 
      var login = function (apiUrl, apiKey, loginID, password) { 
        return $http({ 
          method: "POST", 
          url: apiUrl + "?apiKey=" + encodeURIComponent(apiKey) + "&loginID=" + encodeURIComponent(loginID) + "&password=" + encodeURIComponent(password) 
        }); 
      }; 
      var logout = function (apiUrl, apiKey, UID) { 
        return $http({ 
          method: "POST", 
          url: apiUrl + "?apiKey=" + encodeURIComponent(apiKey) + "&UID=" + encodeURIComponent(UID) 
        }); 
      }; 
      return { login: login, logout: logout }; 
    }) 
})();

另外提个小细节:你的KwaaltjestestService里的错误回调是空的,建议补充deferred.reject(response),这样调用这个服务的代码才能捕获到错误信息,做对应的异常处理。

修改完成后,两个服务会被注册到同一个模块下,同时加载也不会互相覆盖,控制器的代码不需要改动——它们的模块都是独立创建的,本身没有问题。

内容的提问来源于stack exchange,提问作者J. Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:30:00