JavaScript中的“异步”是否实际上会创建异步函数?

时间:2019-01-24 20:49:40

标签: javascript asynchronous async-await

我运行以下代码:

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会使函数异步进行?

任何见识将不胜感激。谢谢!

2 个答案:

答案 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,它可以解析为该函数(或returnundefined执行的操作。看看在调用.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。