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

AngularJS中如何从Factory获取Promise对象?问题排查

问题分析与解决方案

核心错误点

  1. 异步时序问题:调用getConfig后立刻执行console.log,但$http是异步请求,此时请求还未完成,根本拿不到返回数据。
  2. 参数赋值误区:Factory里试图通过参数cr给外部的$scope.mainConf2赋值,但JavaScript函数参数是值传递,这种赋值只会修改函数内部的局部变量,无法影响外部的$scope属性。
  3. Factory返回值错误:你的getConfig没有返回Promise,导致Controller无法正确监听异步操作的完成状态。

修正后的代码

第一步:重构Factory

让getConfig直接返回$http的Promise,将数据处理逻辑交给Controller:

export default app.factory('mainFactory', $http => {
  return {
    getConfig: () => $http({ method: 'GET', url: '/main-conf' })
      .then(res => res.data)
      .catch(error => {
        console.log(error);
        throw error; // 抛出错误,让Controller可以捕获处理
      })
  }
});

第二步:修正Controller逻辑

通过Promise的.then方法在请求完成后再赋值并打印数据:

import app from '../../main-module/index.js';

export default app.controller('mainCtrl', [
  '$scope',
  '$http',
  'mainFactory',
  '$window',
  ($scope, $http, mainFactory, $window) => {

    $scope.reloadRoute = () => $window.location.reload();
    
    // 调用Factory方法,等待异步请求完成后处理数据
    mainFactory.getConfig()
      .then(data => {
        $scope.mainConf2 = data;
        console.log('$scope.mainConf2', $scope.mainConf2); // 此时能拿到正确数据
      })
      .catch(error => {
        // 这里可以添加请求失败的处理逻辑
      });
  }
]);

补充说明

  • 异步操作(如AJAX请求)不会阻塞代码执行,必须通过回调、Promise或async/await来处理后续逻辑。
  • Factory的职责应该是封装请求逻辑并返回Promise,而非直接修改外部$scope,这样更符合模块化的设计思想。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 18:05:29