await未获取返回值:async递归函数调用后变量为undefined求助
为什么我的async递归函数返回undefined?
我一眼就看到问题所在了——你的递归调用那一行没有return结果!
先看你原代码的最后部分:
if (description == 'Test1' || description == 'Test2'){ return eltern; } eltern = await getEltern(eltern.CategoryId);
当第一次不满足if条件时,你确实调用了递归的getEltern,也把结果赋值给了eltern,但你没有把这个最终拿到的eltern返回出去。async函数如果没有显式的return语句,默认会返回Promise.resolve(undefined),这就是为什么你调用后得到的是undefined。
修正方案
只需要在递归调用的时候加上return,或者在赋值后return变量,两种写法都可以:
写法1:直接return递归调用的结果
async function getEltern(id){ var eltern = await getTreeById(id); var description = eltern.Descriptions.CategoryDescription; description = (description.length > 1) ? description[0].Description: description.Description; if (description == 'Test1' || description == 'Test2'){ return eltern; } // 关键:把递归的结果return出去 return await getEltern(eltern.CategoryId); }
写法2:赋值后return变量
async function getEltern(id){ var eltern = await getTreeById(id); var description = eltern.Descriptions.CategoryDescription; description = (description.length > 1) ? description[0].Description: description.Description; if (description == 'Test1' || description == 'Test2'){ return eltern; } eltern = await getEltern(eltern.CategoryId); // 新增:返回最终拿到的eltern return eltern; }
额外建议:添加边界条件避免异常
为了防止递归过程中出现getTreeById返回null、或者节点没有CategoryId导致无限递归的情况,最好加上边界判断:
async function getEltern(id){ // 如果id不存在,直接返回null避免无效调用 if (!id) return null; var eltern = await getTreeById(id); // 如果获取不到节点,也返回null if (!eltern) return null; var description = eltern.Descriptions.CategoryDescription; description = (description.length > 1) ? description[0].Description: description.Description; if (description == 'Test1' || description == 'Test2'){ return eltern; } return await getEltern(eltern.CategoryId); }
这样修改后,你再调用var eltern = await getEltern(parentNode.CategoryId)就能拿到预期的对象啦!
内容的提问来源于stack exchange,提问作者wapt49
相关产品推荐
相关产品推荐

