一下子懂——JavaScript异步编程
前言异步就是异步的意思……这一段可能有点枯燥,但它是JavaScript中非常重要的一个概念,非常有必要学习。目的是提高开发效率,编写易于维护的代码。简介为什么请求时页面会卡住??$.ajax({url:"www.xx.com/api",async:false,//true成功:function(result){console.log(result);},});为什么数据更新了,但是DOM没有更新??//异步批量更新DOM(vue-nextTick)//{{num}}
newVue({el:"#app",data:{num:0,},mounted(){letdom=document.getElementById("app");while(this.num!==100){this.num++;}console.log("Vuenum="+this.num,"DOMnum="+dom.innerHTML);//Vuenum=100,DOMnum=0//nextTick或setTimeout},});异步原因:单线程(一个时间点,只有一件事),浏览器的JS引擎是单线程的。单线程是指JS引擎中只有一个线程负责解释和执行IavaScript代码,可以称之为主线程。所谓单线程就是一次只能完成一个任务。如果有多个任务,则必须排队,上一个任务完成后,才能执行下一个任务。我们来看看浏览器内核的线程图:其中,渲染线程和JS线程是互斥的。假设有两个函数,一个修改,一个删除,同时操作一个DOM节点。如果有多个线程,如果两个线程一起执行,肯定会死锁,就会出问题。为什么JS设计成单线程,是因为浏览器的特殊环境。单线程优缺点:这种模式的优点是实现起来比较简单,执行环境也比较简单;缺点是只要一个任务耗时长,后面的任务就必须排队,会延迟整个程序的执行。常见的浏览器无响应(假死)往往是因为某段Javascript代码运行时间过长(比如死循环),导致整个页面卡在这个地方,无法执行其他任务。常见阻塞(死循环):while(true){}JS本来是设计成运行在浏览器中的脚本语言,不想弄的这么复杂,所以设计成单线程的,也就是,一个时间点,只能做一件事。为了解决单线程阻塞的缺点:产生了异步。以泡面为例:同步:买泡面=》烧水(凝视)=》煮面=》吃泡面异步:买泡面=》煮水(水烧开,水壶响-回调)=》lookTV="煮面(面好了水壶响-回调)="watchingTV="煮熟了给我打电话="吃方便面看电视是异步操作,水壶响是回调function.异步编程JS中大部分代码都是同步执行的,只有少数函数是异步执行的,异步执行的代码需要异步编程异步代码setTimeout(()=>{console.log("log2");},0);console.log("log1");//??log1log2异步代码的特点:不是立即执行,而是需要等待,在以后的某个时间点执行同步代码异步代码整体代码PromisesetTimeout/setInterval事件循环(Eventloop)执行顺序:执行整体代码