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

AngularJS中如何在加载data-table前解析完HTTP响应?

解决Angular中HTTP请求顺序执行问题

你的核心问题是两个异步请求没有按依赖顺序执行——第二个请求(获取配置数据)需要用到第一个请求生成的oumap,但原代码里两个请求是并行发起的,导致oumap可能还没创建好,第二个请求就开始处理数据了。

修正后的代码

// 先执行第一个请求,创建完map后再初始化Data-Table
MasterServices.getAllCustomers().then(function(result) {
    $scope.resultdata = result.data;
    // 先初始化map,避免后续调用has/get时出错
    $scope.oumap = new Map();
    $scope.resultdata.forEach(element => {
        $scope.oumap.set(element.companyId, element.companyName);
    });

    // 现在map已准备就绪,初始化Data-Table
    vm.dtOptions = DTOptionsBuilder.fromFnPromise(function() {
        // 直接返回getCompConfig的Promise,无需手动创建defer(Angular的$http请求本身就返回Promise)
        return MasterServices.getCompConfig().then(function(result) {
            angular.forEach(result.data, function(val) {
                // 用已创建好的map匹配公司名称
                val.companyName = $scope.oumap.has(val.compId) 
                    ? $scope.oumap.get(val.compId) 
                    : " ";
            });
            return result.data;
        });
    }).withPaginationType('full_numbers').withOption('createdRow', createdRow);
});

关键改进点

  1. 请求顺序绑定:把Data-Table的初始化逻辑放到第一个请求的then回调里,确保只有当oumap完全创建完成后,才会发起第二个HTTP请求。
  2. 移除冗余defer:MasterServices.getCompConfig()本身就返回Promise,直接在它的then里处理数据并返回结果即可,fromFnPromise会自动处理这个Promise,不用手动创建$q.defer。
  3. 初始化map:提前创建空Map,避免因$scope.oumap未定义导致的has/get方法调用错误。

另一种链式写法(更清晰的Promise流程)

如果需要拆分逻辑,可以把第一个请求封装成独立的Promise函数:

// 封装加载客户map的逻辑,返回Promise
const loadCustomerMap = () => {
    return MasterServices.getAllCustomers().then(result => {
        $scope.resultdata = result.data;
        $scope.oumap = new Map();
        result.data.forEach(element => {
            $scope.oumap.set(element.companyId, element.companyName);
        });
        return $scope.oumap;
    });
};

// 链式调用,确保顺序执行
loadCustomerMap().then(() => {
    vm.dtOptions = DTOptionsBuilder.fromFnPromise(() => {
        return MasterServices.getCompConfig().then(result => {
            angular.forEach(result.data, val => {
                val.companyName = $scope.oumap.has(val.compId) 
                    ? $scope.oumap.get(val.compId) 
                    : " ";
            });
            return result.data;
        });
    })
    .withPaginationType('full_numbers')
    .withOption('createdRow', createdRow);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:05:26