Promise返回Promise而非数据,如何让指定函数返回3?
解决Promise返回原始值而非处理后结果的问题
嘿,我来帮你捋清楚这个问题~你现在的核心问题是:你的fn()返回的是最开始创建的那个Promise(它最终会resolve成1),而你在then里做的处理没有传递出去。
问题分析
原代码里,你调用promise.then(...)的时候,这个then方法其实会返回一个新的Promise,这个新Promise的resolve值就是你在then回调里return的内容。但你没有把这个新Promise作为fn()的返回值,而是返回了最初的那个Promise,所以外面调用fn()拿到的还是resolve为1的Promise,自然得不到你想要的3。
修改后的代码(两种写法)
写法1:基于原代码调整
const fn = () => { let promise = new Promise(function(resolve, reject) { setTimeout(() => resolve(1), 1000); }); // 把then返回的新Promise赋值给promise,这样返回的就是处理后的Promise promise = promise.then(function(result) { return result + 2; // 1+2=3,得到你想要的结果 }); return promise; }
写法2:更简洁的链式调用
const fn = () => { return new Promise((resolve, reject) => { setTimeout(() => resolve(1), 1000); }) .then(result => result + 2); // 直接返回链式调用后的Promise }
如何获取返回的3?
因为fn()返回的依然是Promise(Promise的特性就是不会直接返回同步值,必须通过异步方式获取),所以你需要用以下两种方式获取结果:
// 方式1:用then回调获取 fn().then(value => { console.log(value); // 1秒后输出3 }); // 方式2:用async/await(更像同步写法) async function getResult() { const value = await fn(); console.log(value); // 1秒后输出3 } getResult();
关键知识点回顾
- Promise的
then、catch、finally方法都会返回一个新的Promise,这个新Promise的状态由回调函数的返回值决定。 - 如果想让外层拿到处理后的结果,必须把这个新的Promise返回出去,而不是原始的Promise。
内容的提问来源于stack exchange,提问作者Kaisin Li
相关产品推荐
相关产品推荐

