setTimeout与setInterval到AJAX异步
setTimeout与setInterval执行看下这道题的执行结果如何: console.log(1); setTimeout(function { console.log(2); },100) setTimeout(function { console.log(3); },50) console.log(4); 首先我们看一下以下代码打印结果 打印结果是 1、4、3、2,你可能觉得理所应当,那我们再看下下面这个例子 console.log(1); setTimeout(function { console.log(2); },0) console.log(3); 这次的结果又会是什么呢? 1、3、2,不是1、2、3。到这里你可能会有疑惑了,明明定时器设置的时间为0,而且浏览器解析js是按照从上到下执行的,应该是1、2、3才对啊? 到这里我们要提一下浏览器的线程问题。 与js相关的浏览器线程有三个(注意:js解析是单线程) - js代码执行线程( 主线程 ) - UI渲染线程 - 事件循环线程 其中js代码执行线程与UI渲染线程两者是互斥的,也就是说js代码执行线程运行的时候,UI渲染线程会停止工作,这样做也是为了防止js中的DOM操作会导致两线程冲突;而事件循环线程比较特殊,接下来会根据setTimerout的执行过程进行讲解其作用。 回到上面的第一道题目 console.log(1); 执行过程:
setInterval原理与之相同,不作另说。 总的来说,setTimeout与setInterval的执行会等到主线程的所有任务全部执行后,才会再执行其中的回调函数,所以在使用它们的时候也要注意,特别是在主线程中有特别耗时的任务的时候,两种定时器会被不可预测的延后。 讲到这里,大家有没有想到什么呢? 恩,就是异步,setTimeout的执行有没有一点异步的感觉呢?但又因为它必须是等到主线程全部执行完才会执行,所以可以称之为伪异步。 说到异步,我们还会想到AJAX,都说AJAX是异步,但是它异步的原理想必还不清楚的你应该有点兴趣了解的。 异步:简单说就是在处理某一件事的时候还可以去做别的事,比如:你在银行取号后等待取钱,在等待的过程中你还可以玩手机,和别人聊天等等,这个过程就是异步的。 AJAX 异步的原理
总的说来,AJAX的请求不会干扰到主线程任务的执行,它有自己专供的线程来处理其任务 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |