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

JavaScript Promise与then方法报错:Cannot read properties of undefined (reading 'then')

问题原因

你遇到的TypeError: Cannot read properties of undefined (reading 'then')错误,核心原因是**dostart()函数没有返回Promise**——函数默认返回undefined,自然无法调用.then()方法。

当前代码里,dostart内部只是调用了nonBlockingSleep().then(...),但没有把这条Promise链返回出去,导致函数执行完后返回undefined,后续调用.then()时就会报错。

修复方案

方案1:返回Promise链

修改dostart函数,让它返回nonBlockingSleep的Promise链:

function nonBlockingSleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

function dostart() {
  console.log("Hello2");

  // 关键:返回这条Promise链
  return nonBlockingSleep(2000).then(() => {
    console.log("Done");
    return "Resolved"; // 直接返回值即可,then会自动包装为resolved状态的Promise
  });
}

dostart().then(value => {
  console.log(value); // 2秒后会打印"Resolved"
})

说明:返回nonBlockingSleep().then(...)的结果后,dostart()就会返回一个Promise,后续就能正常通过.then()获取最终返回值。另外return "Resolved"比return Promise.resolve("Resolved")更简洁,因为then回调中返回的非Promise值会被自动包装为resolved状态的Promise。

方案2:使用async/await语法(更直观)

用async/await重构代码,逻辑更清晰:

function nonBlockingSleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function dostart() {
  console.log("Hello2");

  await nonBlockingSleep(2000); // 等待异步操作完成
  console.log("Done");
  return "Resolved"; // async函数会自动把返回值包装为Promise
}

dostart().then(value => {
  console.log(value); // 2秒后会打印"Resolved"
})

说明:async函数默认返回Promise,await会暂停函数执行,直到nonBlockingSleep的Promise完成,之后再执行后续代码。返回的"Resolved"会被自动包装为resolved状态的Promise,完全符合你的需求。

验证结果

修改后运行代码,会依次输出:

  1. 立即打印Hello2
  2. 等待2秒后打印Done
  3. 紧接着打印Resolved

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:30:43