为什么我的async函数没有隐式返回Promise反而返回undefined?
问题原因解答
你提到的async函数返回规则本身是正确的:
Async函数始终会返回一个Promise。如果没有显式返回Promise,你返回的值会自动被包装在Promise中。
getData2()返回undefined的核心原因和async规则无关,是你混淆了两个函数的返回值:
- 你写在
setTimeout回调里的return,是setTimeout回调函数的返回值,和外层的getData2没有任何关联 getData2本身的函数体只有一行setTimeout调用,没有给自身写return语句,默认返回undefined
执行逻辑可以拆解为:
- 调用
getData2后,同步执行setTimeout,将1秒后执行的回调推入异步队列 setTimeout执行完成后,getData2没有其他代码,默认返回undefined- 按照async函数的规则,这个
undefined会被自动包装为状态为fulfilled的Promise await getData2()直接拿到这个Promise的结果undefined输出,1秒后setTimeout的回调才会执行,此时回调的返回值没有被任何变量接收,完全不会影响之前的执行结果
对比getData的逻辑:getData显式返回了一个自定义Promise,await会等待这个Promise调用resolve之后才会拿到结果,因此能正常输出异步拿到的值。
修正后的getData2写法
如果要让getData2正常返回异步结果,需要把setTimeout包装成Promise后返回:
const getData2 = async() => { return new Promise(resolve => { setTimeout(() => { resolve('this is the data without an explicit promise'); }, 1000); }); };
内容的提问来源于stack exchange,提问作者Edward Tanguay
相关产品推荐
相关产品推荐

