我运行以下代码:
let asyncFunction = async () => {
console.log("hello world")
return Promise.resolve("resolution");
}
let returnValue = asyncFunction();
console.log(returnValue)
这将记录“ hello world”,然后记录“ Promise {}”。我的问题是:
1)首先记录“ hello world”的事实表明,使asyncFunction成为async函数并不会使其异步运行。如果它是异步运行的,它将被推送到执行队列,直到主函数从堆栈中弹出后才运行。即“ console.log(returnValue)”将首先运行。我对此是否正确,添加'async'不会使函数实际异步运行?
2)如果asyncFunction不是异步运行,则在“ let returnValue = asyncFunction();”行中,应将asyncFunction运行,然后将其返回值分配给returnValue。 returnValue包含“ Promise {}”的事实表明asyncFunction尚未运行,这与asyncFunction是异步的一致。如果我从asyncFunction的定义中删除了“ async”关键字,它将返回“ hello world”,然后返回“ Promise {'resolution'}”。那么,这是否意味着使用异步DOES会使函数异步进行?
任何见识将不胜感激。谢谢!
答案 0 :(得分:3)
我对此是否正确,添加'async'不会使函数实际异步运行?
async
函数实际上从头开始逐行逐行同步 ,直到遇到异步事件,例如Promise的await
。这与手动构造Promise的行为相同-Promise构造函数最初可以同步运行,而不是异步运行,尽管可以进行异步调用:
const prom = new Promise((resolve) => {
console.log('inside constructor');
resolve();
});
console.log('prom has been constructed');
prom.then(() => {
console.log('inside then');
});
console.log('end of main thread');
async
函数将始终返回一个Promise
,它可以解析为该函数(或return
)undefined
执行的操作。看看在调用.then
函数时调用async
也是如何导致.then
在最后执行:
let asyncFunction = async () => {
console.log("hello world")
return Promise.resolve("resolution");
}
let returnValue = asyncFunction();
console.log('returnValue', returnValue);
returnValue.then(() => {
console.log('inside then');
});
console.log('end of main thread');
答案 1 :(得分:0)
我认为您可能误解了async
背后的机制。您描述的函数调用是同步的。 async
关键字仅意味着函数的返回值将始终包装在Promise中,并且您可以使用await
关键字来等待函数执行中的Promises。