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); });
关键改进点
- 请求顺序绑定:把Data-Table的初始化逻辑放到第一个请求的
then回调里,确保只有当oumap完全创建完成后,才会发起第二个HTTP请求。 - 移除冗余defer:
MasterServices.getCompConfig()本身就返回Promise,直接在它的then里处理数据并返回结果即可,fromFnPromise会自动处理这个Promise,不用手动创建$q.defer。 - 初始化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
相关产品推荐
相关产品推荐

