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,完全符合你的需求。
验证结果
修改后运行代码,会依次输出:
- 立即打印
Hello2 - 等待2秒后打印
Done - 紧接着打印
Resolved
内容的提问来源于stack exchange,提问作者Sylv99
相关产品推荐
相关产品推荐

