Js async await 的疑问

明月照何处
  • 687
async {

await a()

await b()

c()

d()

}

这四个方法的执行顺序是怎样的呢?

是 先 a() 再 b() 后 c(),d() ?
还是 先 c(),d() 再 a() 后 b() ?

回复
阅读 2.9k
4 个回答

如果x是Promise, 表達式await x 在 x fulfill 時才 "返回".

等價於

Promise.resolve(a())
    .then(() => Promise.resolve(b()))
    .then(() => { c(); d(); });
neal
  • 797
function a() {console.log('a')}
function b() {console.log('b')}
function c() {console.log('c')}
function d() {console.log('d')}
const request = async() => {
    await a()
    await b()
    c()
    d()
    }
request()

在console执行上述代码,最终结果是'a','b','c','d',看来是我一开始的理解不太正确,async/await自己将同步代码和异步代码放在一起处理了,刚刚翻译了一篇关于async/await的文章,大家可以阅读了解下。

有await的地方如果是异步则等异步执行完执行下一步 同步则按同步方式执行 其他不变啊 所以abcd啊 只是d不等c异步回调 如果c是异步的话 ?

chenxxzhe
  • 813

答案:abcd,但会跳来跳去。先执行a(),等到a执行完就跳出async,执行后续程序,执行完,如果之前a返回了promise,就要等它resolve,如果没有promise就直接执行async后续的,也就是b,b()过程同a(),之后cd是同步的,按顺序执行。

原因:async函数是为了实现异步的,也就是让出线程让其他代码运行,await就是一个要处理器让出线程的标记,await后面的函数会先执行一遍,然后跳出async执行其他(要看await后面的是不是异步promise),然后再执行async

例子:可以切换promise看看


    function sleep(ms, tag){
        console.log(performance.now())
        console.log('func',tag,'start')
        var end = new Date().getTime() + ms
        while (true){
            if(end <= new Date().getTime()) break
        }
        console.log('func',tag,'end')
    }
    function sleepPromise(ms,tag) {
      console.log(tag,'start')
      return new Promise((resolve) => {
        setTimeout(resolve, ms);
      });
    }

    async function test(){
        await sleep(1000, 'a')
        // await sleepPromise(1000,'a')
        await sleep(1000, 'b')
        // await sleepPromise(1000,'b')
        sleep(1000, 'c')
        sleep(1000, 'd')
    }
    console.log(performance.now())
    test()
    console.log('after test') // a执行完之后运行
    sleep(1000, 'wait to test b start')
    setTimeout(function(){console.log('after b')}, 1000) //看b是不是异步promise,不是的话要到最后才执行

注意,第一个await是一定会跳出async的,但后面的await如果没有返回promise,就会被内部转成promise,并立即resolve(retrunValue),因而不会跳出async。(这段可能不太准确)

宣传栏