axios

js异步方法里async await setTimeout

2019-01-04  本文已影响0人  轨迹枫

前言: js异步执行的方法有传统的回调函数callback、es6的promise函数、es7的async await终极大法,setTimeout(可以模拟异步),然鹅,这些异步方法之间的执行顺序真是云里雾里,希望写完这篇文章之后能让你茅塞顿开。

知识点: 

1、setTimeout  定时器,属于js任务队列里的宏任务。指的是把任务队列塞进执行栈里等待执行线程依次执行。虽然可以把它设置微0,但是仍然需要等待本轮执行环境里面的所有同步 异步任务执行完毕之后才会去执行它。

2、promise es6de 异步语法,属于js任务队列里的微任务,在执行本轮宏任务的过程中,如果遇到promise,会将其塞入本轮执行过程的微任务,待本轮宏任务执行完毕之后,才会执行它。执行完毕之后,开始执行下一轮任务队列。

3、async await 异步语法,基于promise,是其语法糖,让异步更像同步任务。如果使用async,函数体里有return XX,会被包装成一个异步promise.resolve('XXX'), 如果没有显式return,那么async也同样包装成promise.resolve('undefined');

注意:await 标志着js会去先执行一遍后面紧跟的函数,然后马上让出线程,跳出整个async,去执行本轮执行周期里面的任务,等待本轮的宏任务(同步任务)执行完成之后,再回来async里等待之前await的函数的返回值,如果是返回值异步promise,那么会把它塞入promise.resolve()微任务(异步任务执行栈),等待它前面的异步任务执行完毕之后,再得到await promise.resolve()的值,然后才是去执行await后面的逻辑,如果await 函数体返回的不是异步promise,那么就直接去执行其后面的逻辑。  

来一段代码练习一下

setTimeout(()=>{

    console.log("setTimeout0");

}, 0);

async function testSometing () {

    console.log("执行testSometing");

    return"testSometing";

}

async function testAsync() {

    console.log("执行testAsync");

    returnPromise.resolve("hello async");

}

async function test() {

    console.log("test start...");

    const v1 =await testSometing();

    console.log(v1);

    const v2 =await testAsync();

    console.log(v2);

    console.log(v1, v2);

}

test();

var promise =newPromise((resolve)=> {console.log("promise start.."); resolve("promise");});

promise.then((val)=>console.log(val));

console.log("test end...")

正确的执行顺序是   

test start...

VM237:9 执行testSometing

VM237:41 promise start..

VM237:45 test end...

VM237:43 promise

VM237:29 testSometing

VM237:17 执行testAsync

VM237:33 hello async

VM237:35 testSometing hello async

undefined

VM237:3 setTimeout0

上一篇 下一篇

猜你喜欢

热点阅读