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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:40:05