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

AngularJS中数组存在实际值却提示Array is undefined如何解决

问题根因

你遇到的是JavaScript异步执行的经典场景:代码中调用的两个服务API都是异步请求,写在最外层的console.log(radaList[0])会在API请求回调触发前就执行,此时radaList还未被填充数据,因此取第0位为undefined。
你打印完整数组能看到值是浏览器控制台的引用特性:你手动展开数组时,异步回调已经执行完成、数组已经被填充,这属于控制台的展示特性,和实际代码执行顺序不一致。

解决方法

因为存在多个并行的listForRadaGroup异步请求,推荐使用AngularJS内置的$q服务做异步聚合,等待所有请求全部完成后再操作radaList:

  1. 首先在你当前的控制器/服务中依赖注入$q
  2. 改造代码如下:
let promiseList = [];
UserRolesService.api.getUserRadaGroups({userLogin: $scope.selectedUserObj.login}, function(a) {
    _.each(a.radaGroups, function(c) {
        // 把每个异步请求包装为Promise存入列表
        let reqPromise = $q(function(resolve) {
            AuthorityRolesService.api.listForRadaGroup({radaGroup: c}, function(b) {
                let roleNames = [];
                for(var i =0; i<b.length;i++){
                    console.log(b[i].roleName);
                    roleNames.push(b[i].roleName);
                }
                resolve(roleNames);
            });
        });
        promiseList.push(reqPromise);
    });

    // 等待所有异步请求执行完成
    $q.all(promiseList).then(function(allResult) {
        // 合并所有请求返回的角色数组
        let radaList = [].concat.apply([], allResult);
        // 此处操作radaList即可拿到正确值
        console.log(radaList[0]);
        // 所有依赖radaList的后续逻辑都要写在此回调内
    })
});

如果你的服务API本身已经支持返回Promise,不需要手动包装$q,可以直接使用接口返回的Promise实例,代码会更简洁。

如果仅为临时调试场景,也可以用延时打印的方式验证结果,生产环境不推荐使用:

setTimeout(function() {
    console.log(radaList[0]);
}, 1000);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:30:05