Promise链无法输出预期值4,求排查代码问题
问题核心原因
你报错的根本原因是**doSomething()返回的不是Promise实例**,而是普通数值(2)。普通数值类型没有.then()方法,所以调用doSomething().then()会直接抛出错误。
Promise链的前提是起始调用必须返回一个Promise(或thenable对象),这样才能链式调用.then()方法。你参照的MDN示例里,起始函数应该是返回Promise的,你忽略了这一点。
修正方案
把起始函数doSomething()改成返回Promise实例,后续函数如果返回普通值,.then()会自动将其包装为resolved状态的Promise,所以可以保持原样(或者也统一改成返回Promise,效果一致)。同时注意给变量加上let/const声明,避免全局变量污染:
doSomething() .then((result) => doSomethingElse(result)) .then((newResult) => doThirdThing(newResult)) .then((finalResult) => { console.log(`Got the final result: ${finalResult}`); // 最终会输出 "Got the final result: 4" }) .catch(failureCallback); function doSomething(){ const a = 1 + 1 return Promise.resolve(a); // 用Promise.resolve包装数值,返回Promise实例 } function doSomethingElse(param){ const b = param + 1 return b; // 返回普通值,then会自动包装为Promise } function doThirdThing(param){ const c = param + 1 return c; } function failureCallback(){ console.log('it did not work') }
如果你想更贴近Promise的原始构造方式,也可以用new Promise来定义函数:
function doSomething(){ return new Promise((resolve) => { const a = 1 + 1 resolve(a); // 触发resolve,传递结果 }) }
补充说明
- 当你在
.then()的回调里返回普通值时,JavaScript会自动把它包装成一个resolved状态的Promise,所以后续的.then()能正常接收这个值。 - 你的代码里变量
a、b、c没有声明,会隐式成为全局变量,这是不良编程习惯,建议始终用let或const声明变量。
内容的提问来源于stack exchange,提问作者thomasquestions
相关产品推荐
相关产品推荐

