JS变量赋值后仍为undefined求助:异步函数返回值异常
问题原因及解决方案
核心问题
你的set_problem函数虽然标记了async,但内部的fetch操作的Promise链没有被返回,导致函数默认返回一个状态为resolved、值为undefined的Promise。这就是update里await set_problem(url)得到undefined的根本原因——你在then回调里返回的problemId并没有传递到外层函数的返回值中。
修复方案
方案一:返回fetch的Promise链
在fetch(url)前加上return,让set_problem函数返回整个Promise链,这样await就能拿到最终then回调里返回的problemId:
async function set_problem(url){ let p_arr = [] url = url + "action/getting_problems"; // 加上return,将Promise链作为函数返回值 return fetch(url).then(res => res.json()) .then(function(data) { data.forEach(problem => { p_arr.push(problem._problemId); console.log(p_arr); }); }).then(()=> { let problemId = p_arr[Math.floor(Math.random() * p_arr.length)] console.log(problemId); return problemId; }); }
方案二:用async/await重构(更易读)
既然已经使用了async关键字,直接把then链改成await写法,逻辑更清晰,也不容易遗漏返回值:
async function set_problem(url){ let p_arr = [] url = url + "action/getting_problems"; const res = await fetch(url); const data = await res.json(); data.forEach(problem => { p_arr.push(problem._problemId); console.log(p_arr); }); let problemId = p_arr[Math.floor(Math.random() * p_arr.length)] console.log(problemId); return problemId; }
验证修复
修改后,update函数里的id就能正确获取到随机生成的problemId,后续拼接URL的逻辑也能正常执行。
内容的提问来源于stack exchange,提问作者Aditya Byju
相关产品推荐
相关产品推荐

