js异步总结

本文详细介绍了JavaScript的异步机制,包括单线程、事件循环(Event Loop)、jQuery的Deferred、Promise、Generator以及async/await。重点阐述了事件循环的工作原理,如何通过任务队列处理异步任务,以及微观任务和宏观任务的区别。通过对这些概念的理解,帮助开发者更好地掌握JavaScript的异步处理。
摘要由CSDN通过智能技术生成

一、单线程

    单线程:只有一个线程,只能做一件事
     原因:避免DOM渲染的冲突
     解决方案:异步

浏览器可以渲染DOM

js可以修改DOM结构
js执行的时候,浏览器DOM渲染会暂停
两段js也不能同时执行(都修改DOM就冲突了)
webworker支持多线程,但是不能访问DOM

二、event- loop

event-loop: 事件轮询,js实现异步的具体解决方案
1、同步代码,直接执行
2、异步函数先放在异步队列中
3、待同步函数执行完毕,轮询执行异步队列的函数
 

$(function () {
    $.ajax({
        url: 'xxx',
        success: function () {
            console.log(0)
        }
    }) // 访问成功后,被加入到异步队列中(看响应速度)
    setTimeout(function () {
        console.log(1)
    }, 100) // 100ms 之后被放入异步队列
    setTimeout(function () {
        console.log(2)
    }) // 立即被放入异步队列
    console.log(3) // 主进程
    // 输出结果
    // 3 2 1 0 也有可能是 3 2 0 1
})

三、jQuery的Deferred

function waitHandle() {
    var dtd = $.Deferred() //创建一个deffered对象
    var wait = function (dtd) { // 要求传入一个deferred对象
        var task = function () {
            console.log('执行完成')
            dtd.resolve() // 表示异步任务已经完成
            // dtd.reject() // 表示异步任务失败或出错
        }
        setTimeout(task, 2000)
        return dtd  // 要求返回deferred对象
    }
    // 注意,这里一定要有返回值
    return wait(dtd)
}
var w = waitHandle()
w.then(function () {
    console.log('ok 1')
}, function () {
    console.log('error 1')
}).then(function () {
    console.log('ok 2')
}, function () {
    console.log('error 2')
})
var ajax = $.ajax('./data.json')
ajax.done(function () {
    console.log('success1')
}).fail(function () {
    console.log('error')
}).done(function () {
    console.log('success2')
})

返回一个deferred对象
无法改变js异步和单线程的本质
只能从写法上杜绝callback这种形式
它是一种语法糖形式,但是解耦了代码
很好的体现:开放封闭原则(可扩展,不可修改)

// 使用jquery deferred
function waitHandle() {
    var dtd = $.Deferre
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值