如何让函数返回的Promise立即resolve?为何调用后数据为undefined?
问题原因分析及修复方案
咱们来一步步拆解你遇到的问题:
你的getBrands方法里,核心问题出在Promise的链式传递和返回值处理上:
- 你创建的Promise
p是通过resolve()直接完成的,但这里没有传递任何参数,所以这个Promise最终resolved的值就是undefined。 - 你在
p.then()里返回了{'a': 1, 'b': 2},但then()方法本身会返回一个全新的Promise,这个新Promise才会把你返回的对象作为它的resolved值。可你最后返回的是原来的p,而不是这个新的Promise,所以外部调用getBrands()时,拿到的还是那个resolved值为undefined的原始Promise,自然打印出来的data就是undefined了。
修复方案(三种可选)
方案1:直接在resolve中传递目标数据
最直接的方式,既然你要立即resolve并返回数据,直接把数据传给resolve即可:
class BrandsDataFetcher extends BaseDataFetcher { getBrands() { return new Promise((resolve, reject) => { // 直接把要返回的数据传给resolve resolve({'a': 1, 'b': 2}); }); } }
方案2:返回then链式后的新Promise
如果你的实际场景中需要在then里做一些额外操作(比如预处理数据),记得要把then返回的新Promise返回出去:
class BrandsDataFetcher extends BaseDataFetcher { getBrands() { const p = new Promise((resolve, reject) => resolve()); // 返回then生成的新Promise,而不是原始的p return p.then(() => { return {'a': 1, 'b': 2}; }); } }
方案3:用Promise.resolve简化代码
因为你是要立即resolve一个值,完全可以用Promise.resolve()这个快捷方式,省去手动创建Promise的步骤:
class BrandsDataFetcher extends BaseDataFetcher { getBrands() { // 直接返回一个已resolve的Promise,值为目标对象 return Promise.resolve({'a': 1, 'b': 2}); } }
内容的提问来源于stack exchange,提问作者MarksCode
相关产品推荐
相关产品推荐

