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

如何在Angular Factory中发起HTTP请求?获取数据返回undefined求助

问题根源

这个问题核心是没处理好Angular里异步请求的Promise机制:你的Profile.getProfile方法没有返回异步操作的Promise,$http.get是异步请求,当你在控制器里直接赋值$scope.vendor = Profile.getProfile(id)时,请求还没完成,所以拿到的是undefined。而且你在then回调里的return result.data只是回调函数的返回值,并没有传递到getProfile方法的外部。

修复步骤

1. 修正Factory代码

让getProfile返回$http.get生成的Promise链,这样控制器就能通过Promise获取异步返回的数据:

.factory('Profile', function($http) {
  return {
    getProfile: function(id) {
      // 返回整个$http请求的Promise链,then里的return会把数据传递给后续调用
      return $http.get(httpUrl + 'vendors/detail?id=' + id).then(function(result) {
        return result.data;
      });
    }
  }
})

2. 修正控制器调用逻辑

因为getProfile现在返回的是Promise,你需要用.then()来接收异步结果,而不是直接赋值:

.controller('profileCtrl', function($scope, Profile) {
  $scope.contact = function(id) {
    Profile.getProfile(id).then(function(data) {
      $scope.vendor = data;
      console.log($scope.vendor); // 这里就能正常拿到服务器返回的数据了
    }).catch(function(error) {
      // 别忘了处理请求失败的情况,比如网络错误、接口报错
      console.error('获取数据失败:', error);
    });
  }
})
额外提示
  • Angular的$http本身就返回Promise对象,我们可以直接利用它的链式调用特性简化异步逻辑。
  • 永远不要忽略异步操作的错误处理,.catch()能帮你快速排查请求失败的原因。

内容的提问来源于stack exchange,提问作者Abaij

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:54:44