javascript 谁能给我解释一下?我好像不明白?[复制]

to94eoyn  于 2022-12-17  发布在  Java
关注(0)|答案(2)|浏览(150)

此问题在此处已有答案

Is the Promise constructor callback executed asynchronously?(2个答案)
When is the body of a Promise executed?(4个答案)
19小时前关门了。
我读了关于事件循环和回调队列和微/宏任务队列,但也许我得到了一些错误的方式,有人能为我可视化吗?,它将帮助我理解这么多的概念。

console.log(1)
const wait2sec = new Promise((resolve, reject) => {
    console.log(2)
    setTimeout(() => {
        console.log(3)
        resolve(true)
    }, 2000)
    console.log(4)
})

const X =async () => {
    await wait2sec
    console.log('ok')
}
X()
console.log(5)

我认为它应该记录:1、5、2、4、3,可以,但它记录:一,二,四,五,三,好

toiithl6

toiithl61#

MDN(强调我的):
异步函数的主体可以被看作是由零个或多个await表达式分割的。**顶层代码,直到并包括第一个await表达式(如果有),都是同步运行的。**这样,没有await表达式的异步函数将同步运行。但是,如果函数主体中有await表达式,异步函数将总是异步完成。
这就是这里发生的事情,Xwait2sec的代码同步运行,因此在console.log(5)之前运行。

yduiuuwa

yduiuuwa2#

您预期Promise对象和console.log之间会出现并发行为,但没有看到?
1.您创建并立即调用了Promise对象(因此您看不到5在2,4之前,至少声明wait2sec为函数)。
1.没有await或timeout的Promise对象作为一个同步函数运行(因此您看到2、4和3之后的函数)
如果你想看到两个进程之间的并发性,请看下面的代码:

function RandomWork(prefix) {
    return new Promise( resolve => {

        let time = Math.round(Math.random() * 10);
                 
        setTimeout(function() {
            console.log(prefix, 'made some work for:', time, 'ms') 
            resolve('foo');
          }, time);
      });
}

const Process = async(name) => {         

    const prefix = "process_"+name;

    console.log(prefix, 'start');

    for(let i=1; i<10; i++) {
        await RandomWork(prefix);
    }

    console.log(prefix, 'stop');
}

Process(1);
Process(2);

相关问题