TS中Promise问题:为何.then未打印参数222?
问题解答:Promise的then回调未执行的原因
嘿,我来帮你搞明白这个问题~你遇到的核心问题是对Promise构造函数的执行器(executor)函数的工作逻辑理解有误,咱们一步步拆解:
1. 为什么你的代码只打印了1?
你写的Promise构造函数里的执行器是:
(()=>{console.log(1); return 222;})
这里有个关键误区:Promise的执行器函数不是靠return来传递值给后续的then回调的。执行器的返回值会被Promise完全忽略,不管你return什么,都不会改变Promise的状态,也不会把值传递给then。
你的这个Promise从创建开始就一直处于pending(等待)状态,因为你从来没有调用过执行器的第一个参数——resolve函数,所以后续的then回调永远不会被触发,自然也就不会打印222了。
2. 修正后的代码
要让then拿到值并执行回调,你需要调用resolve函数来把值传递出去,同时将Promise的状态改为fulfilled(已完成):
const p: Promise<number> = new Promise<number>((resolve) => { console.log(1); resolve(222); // 用resolve传递值,改变Promise状态 }).then((data) => { console.log(data); // 现在会打印222 return 43; });
运行这段代码,控制台会先打印1,然后打印222,和你预期的一致。
3. 再补充点Promise执行器的知识点
Promise构造函数的执行器格式是:
new Promise((resolve, reject) => { // 异步/同步操作 // 操作成功时调用resolve(结果值) // 操作失败时调用reject(错误信息) })
- 执行器会在Promise创建时立即同步执行,所以你先看到了
1的打印。 - 只有调用
resolve或reject,Promise的状态才会从pending切换到fulfilled或rejected,后续绑定的then/catch回调才会被触发。 resolve的参数会被传递给then的回调函数,reject的参数会被传递给catch的回调函数。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

