zoukankan      html  css  js  c++  java
  • 前端底层-js的异步

    js中的异步

    Javascript语言的执行环境是"单线程"(single thread,就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推)。

    这种模式的好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。常见的浏览器无响应(假死),

    往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他任务无法执行。为了解决这个问题,

    Javascript语言将任务的执行模式分成两种:同步(Synchronous)和异步(Asynchronous)。

     

    “同步模式" 就是上一段的模式,后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的

    ;"异步模式"则完全不同,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调

    函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。

     

    “异步模式" 非常重要。在浏览器端,耗时很长的操作都应该异步执行,避免浏览器失去响应,最好的例子就是Ajax操作。在服务器端,

    "异步模式"甚至是唯一的模式,因为执行环境是单线程的,如果允许同步执行所有http请求,服务器性能会急剧下降,很快就会失去响应。

     

    一、回调函数

    js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数。

    因为函数实际上是一种对象,它可以存储在变量中,通过参数传递给另一个函数,在函数内部创建,从函数中返回结果值”,

    因为函数是内置对象,我们可以将它作为参数传递给另一个函数,到函数中执行,甚至执行后将它返回。

    二、ajax

    待定

    三、事件的绑定

    事件触发线程,当一个事件被触发时该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理。

    这些事件可来自JavaScript引擎当前执行的代码块如setTimeOut、也可来自浏览器内核的其他线程如

    鼠标点击、AJAX异步请求等,但由于JS的单线程关系所有这些事件都得排队等待JS引擎处理。

    四、定时器

    首先要说的是,定时器相关的方法都是属于BOM方法,而定时器呢,它是用于在设定的时
    间执行一段代码,或者在给定的时间间隔内重复该代码。具体函数:

    setTimeout(callback, delay);//delay一定的时间后,执行回调函数只执行一次

    setInterval(callback, delay);//每隔一段时间执行一次callback,反复执行

    clearInterval(timer);//清除定时器

    JS是单线程的,既然是单线程那么就很容易出现线程被堵塞的情况,怎么解决
    呢?——异步!

    代码如下:

    var num = 1;
    setTimeout(function() {
    num++;
    console.log(num);
    }, 1000);
    console.log(num); //结果并是不(2,1)而是(1,2)

    为什么会这样?前面说过了,JS会把定时器事件异步处理,也就是说它并不会等待定时器事件

    处理完成后再执行下面的代码,而是直接将定时器事件插入到事件队列当中后,直接执行下面

    的代码,当定时器事件执行完成后JS再反过头来执行定时器事件的回调部分代码,这就是异步!

    异步可以有效的防止JS线程被堵塞,且会有很高的效率,能够使JS在有限的资源下做更多的事

    情,这一点是很了不起的。

  • 相关阅读:
    简单的评价星星
    存储过程的调用
    连接Oracle的帮助类
    Oracle基础知识笔记
    myBatis自动生成mapping,dao和model
    Spring +SpringMVC 实现文件上传功能。。。
    嵌入式发展
    The Onion Router洋葱路由器
    NFC芯片
    中国计算机学会推荐国际学术刊物 (网络与信息安全)
  • 原文地址:https://www.cnblogs.com/lijieqiqi/p/qieryibu.html
Copyright © 2011-2022 走看看