知识点:JS运行机制

!执行顺序

先同步后异步

同步->process.nextTick->微任务(promise.then)->宏任务(计时器,ajax,读取文件)->setImmediate->后续的事件循环

基本概念

同步:按照顺序执行

异步:先执行一部分 等拿到结果再执行后续的代码

process.nextTick:同步之后,异步之前

setImmediate:当前事件循环结束

异步分:宏任务与微任务

微任务:promise.then

宏任务:计时器、ajax、读取文件(主要是计时器)

async函数

单线程:js是单线程的;一个任务完成之后才能执行另外一个任务

事件循环:处理异步的程序,它会在任务队列中取出任务去执行,它会先处理微任务 在处理宏任务,知道任务队列的事件被执行完(思考:计时器不准是因为只是到点了插到任务队列里,等待同步代码执行完了,再事件循环)

同步代码:放到运行栈里面执行  

异步代码:是到点了插入任务队列,等待事件循环


简单测试

// 2,5,6,8,7,3,1,4

setImmediate(()=>{
    console.log(1);
})

console.log(2)
setTimeout(()=>{
    console.log(3);
},0)

setTimeout(()=>{
    console.log(4);
},100)

console.log(5)

new Promise((resolve)=>{
    console.log(6);  // resolve前是同步的
    resolve();
}).then(()=>{
    console.log(7);
})

process.nextTick(()=>{
    console.log(8);
})

如果对Promise和async还不是很熟悉,可以往下

   // Promise
    let p = new Promise((resolve) => {
        console.log(1)  // 这里还是同步
        resolve('数据')  // 有resolve才可以then
    })
    p.then((data) => {
        console.log(data) // data就是resolve传出来的值
    })



    // async
    async function func() { // 可以说async函数就是一个‘Promise对象’的简写
        return "数据"
    }
    async function func() {  // 展开是这样的
        return new Promise((resolve) => {
            resolve("数据")
        })
    }
    func().then((data) => {
        console.log(data)  // data就是"数据" 
    })
    async function func() { 
        let a = await p1
        let b = await p2
        console.log(a, b) // 1 2  相当于then中执行的代码(微任务)
    }
    func()

进阶测试

    //  1,3,5,8,2,6,7,4

    console.log(1)

    async function async1() {
        await async2()
        console.log(2) // 相当于then,微任务
    }

    async function async1() {
        console.log(3)  // 没有retrun也就是没有resolve 这之前,还是同步
    }

    async1()

    setTimeout(() => {
        console.log(4)
    }, 0)

    new Promise(resolve => {
        console.log(5)  // resolve之前,还是同步
        resolve()
    }).then(function () {
        console.log(6)
    }).then(function () {
        console.log(7)
    })
    console.log(8)

!注意

promise在resolve前是同步,不resolve就没有then的data

async也是promise return就是resolve return前是同步 await后是then(微任务)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值