为何直接调用async函数executePromise()无需await且不报错?
问题与解答
问题描述
我将一个Promise存储在常量中:
const goToWork = new Promise((resolve, reject) => { setTimeout(() => resolve('Go to Work')); });
调用goToWork()会报错expression is not callable。于是我编写了async函数callPromise:
async function callPromise() { return await goToWork; }
尝试await callPromise()会返回pending状态的Promise,因此我又编写了async函数executePromise:
async function executePromise() { console.log(await callPromise()); }
直接调用executePromise()成功输出了Go to Work。我的疑问是:
- 为何调用
executePromise()时没有报错说不在async函数中运行? - 为何不需要对它进行await?
解答
关于第一个疑问
只有使用await关键字时,才要求必须在async函数(或支持顶层await的环境)中执行。而直接调用async函数本身不需要任何特殊环境——调用它只会返回一个Promise对象,不会触发任何报错。
关于第二个疑问
你这里的核心需求是让executePromise内部的console.log执行输出内容。executePromise内部已经通过await callPromise()处理了异步逻辑,只要调用这个函数,它内部的异步流程就会自动推进,最终完成console.log的执行。
当然,如果需要获取executePromise的返回值,或者处理它内部可能抛出的错误,那确实需要用await或者.then()/.catch()来处理;但你当前场景只需要它执行输出操作,所以直接调用就足够了。
内容的提问来源于stack exchange,提问作者Exodus Reed
相关产品推荐
相关产品推荐

