调用group.query获指定结果时出现Cannot read property错误原因排查
解决调用
group.query后出现"Cannot read property 'length' of undefined"的问题 嗨,我帮你拆解下问题根源和解决办法——你遇到的错误核心是异步操作的时序问题,咱们一步步理清楚:
问题出在哪?
你调用的this.ws.call('group.query', ...).subscribe(...)是异步操作:也就是说subscribe里的回调函数要等后端返回数据后才会执行,给this.group_users赋值。但你在subscribe之后立刻就写了if(this.group_users.length === 1),这时候this.group_users还没被赋值,处于undefined状态,自然就会触发"Cannot read property 'length' of undefined"的错误。
另外还有个潜在风险:如果_.find(this.usr_lst[0], {id})没找到对应的用户,user会是undefined,后续调用user.group.id也会直接报错,这点也得补上判断。
两种修改方案
方案1:改用Promise返回结果(适合需要获取布尔值的场景)
因为异步操作没法直接同步返回布尔值,咱们把方法改成返回Promise,让调用方异步获取结果:
checkbox_confirm_show(id: any): Promise<boolean> { // 先判断用户是否存在 const user = _.find(this.usr_lst[0], {id}); if (!user || !user?.group?.id) { console.error('找不到指定用户或用户组ID不存在'); return Promise.resolve(false); } return this.ws.call('group.query', [[["id","=", user.group.id]]]) .pipe(first()) // 只取第一个返回结果 .toPromise() .then(res => { this.group_users = res[0]; return this.group_users.length === 1; }) .catch(err => { console.error('查询组信息失败:', err); return false; }); }
调用这个方法的时候要改成异步方式:
// 调用示例 this.checkbox_confirm_show(你的用户ID).then(result => { if (result) { // 这里写原本return true后要执行的逻辑 } else { // 对应return false的逻辑 } });
方案2:把判断逻辑放到subscribe回调里(适合不需要返回值的场景)
如果不需要把结果返回给其他地方,直接在获取到数据后处理逻辑:
checkbox_confirm_show(id: any){ const user = _.find(this.usr_lst[0], {id}); if (!user || !user?.group?.id) { console.error('找不到指定用户或用户组ID不存在'); return; } this.ws.call('group.query', [[["id","=", user.group.id]]]).subscribe( res=>{ this.group_users = res[0]; // 把判断和后续逻辑放到这里 if(this.group_users.length === 1){ // 执行return true对应的逻辑 } else { // 执行return false对应的逻辑 } }, err => { // 处理请求失败的情况 console.error('查询组信息出错:', err); } ) }
内容的提问来源于stack exchange,提问作者vector8188
相关产品推荐
相关产品推荐

