深入理解异步

    

  今天在写轮播图防止重复时遇到一个问题。我创建一个变量用于防止重复点击,但是按照我的逻辑加上后没有效果,可以看看我的代码。

var lock = false;$(‘.arrow‘).on(‘click‘,function(e){      if (!lock){        return;      }        lock = true;
                e.preventDefault();
                if ($(this).hasClass(‘next‘)) {                  //playNext函数是一个包括了动画的函数
                    playNext();
                }else if ($(this).hasClass(‘pre‘)) {
                    playPrev();
                }
      lock = false
      })

按照我的逻辑是当点击翻页按钮时就上锁,然后等到翻页函数执行完成之后就把锁打开,就完成了上锁的功能。但是我犯了一个很严重的错误。忽略了动画是异步执行的。代码并不会按照我写得顺序来执行。都说异步、this、和原型链是js学习中的三座大山。今天我就来彻底解决这座山。

一、最明显的异步setTimeout

在js编码中经常会使用到setTimeout,但是很多人会误解setTimeout是js的功能,其实并不,setTimeout是浏览器提供的一个api。比如说最常见的一个例子

console.log(1);
setTimeout(function(){
   console.log(2)
},0)
console.log(3);

这段代码的执行结果是1、3、2。可以发现虽然setTimeout的延迟时间是0,也需要等到后面的代码执行完成之后才执行。就是setTimeout的执行原理所导致的。当js按顺序执行时遇到setTimeout时就会将它单独拿出来放在回调队列中,等到其他代码执行完毕之后再去看到没到延迟的时间,如果到了就执行。除了setTimeout是异步之外你还能想到js中哪些是异步的吗?

你仔细想想就会发现js中到处都是异步,下面来看看这个jquery代码示例

$(‘#button‘).on(‘click‘,function(){
   console.log(‘你点了‘)
   $.get(‘/data‘,function(response){
         console.log(response)
    })
     console.log(‘数据拿没拿我不知道‘)
})
console.log(‘我不在乎你点不点‘)

可以发现执行结果顺序是

  1. 我不在乎你点不点
  2. 你点了
  3. 数据拿没拿我不知道
  4. response数据

可以发现事件绑定是异步的、ajax请求是异步的(当然ajax也可以设置为同步的,但是ajax如果不是异步还有什么意义,黑人问号),除此之外jq中的动画也是异步。所以说js中处处都是异步

二、异步是一种模式

看了这么多例子那我们该解释一下什么是异步了。异步并不是js独有也不是编程语言独有,它只是一种模式。它跟编程无关,因为你在现实生活中也经常有异步的例子。

比如说:

  1. 托人买票(买到票之后回电话 :call me back)
  2. 进站找不到票,排在后面的人不会等前面的人找到再进站。

这时候你可能会思路一个问题,都说js引擎是单线程的,那是怎么样做到异步的呢?其实js的异步都是由‘别人‘完成的,而这个‘别人‘是谁呢?等你自己去发现吧。

现在你明白异步是什么了吗?

总结起来异步就是不等到结果就去做其他的事情,而同步就是耐心等结果再执行。

但是需要注意的是js里的异步它是有返回结果的,只是返回的并不是我们需要的结果,比如说:

  1. setTimeout的结果是一个id
  2. $.get的结果是一个请求对象
  3. addEventListener 的结果是空

希望我们能一起翻越这种大山。

时间: 2024-10-19 06:03:59

深入理解异步的相关文章

深入理解异步I/O+epoll+协程

前言 同步和异步的概念描述的是用户线程与内核的交互方式:同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行:而异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数. 阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式:阻塞是指IO操作需要彻底完成后才返回到用户空间:而非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成. 异步I/O 在理解异步I/O之前,我们先要知道什么是同步I/O

vue之理解异步更新 --- nextTick

默认情况下,vue中DOM的更新是异步执行的,理解这一点非常重要. 当侦测到数据变化时,Vue会打开一个队列,然后把在同一个事件循环(event loop)当中观察到的数据变化的watcher推送进入这个队列,加入一个watcher在一个事件循环中被触发了多次,它只会被推送到队列中一次, 然后在进入下一次的事件循环时,Vue会清空队列并进行必要的DOM更新,.在内部,Vue 会使用 MutationObserver 来实现队列的异步处理,如果不支持则会回退到 setTimeout(fn, 0).

理解异步之美:Promise与async await(一)

你可能会放出一个怪物 异步与同步相比,最难以掌控的就是异步的任务会什么时候完成和完成之后的回调问题, 难以掌控的触发状态,让你自己写的代码当时还可以读懂,但是过几天.半个月之后如果不重新盘一边逻辑,你哪知道哪个内容会先执行,借用这么一个例子 listen( "click", function handler(evt){ setTimeout( function request(){ ajax( "http://some.url.1", function respon

Ajax_原生ajax写法、理解异步请求、js单线程+事件队列、封装原生ajax

1.原生Ajax 一定要理解Ajax出现的背景 Ajax通过url查询后端接口的数据,在前端做数据的解析和局部更新 1.隐藏帧iframe方式实现页面局部更新---只是为了比较好的用户体验 访问后台接口数据显示在iframe页面中显示,没有做主页面的刷新,但页面实际上也刷新了  看左上角的转圈圈了 2.Ajax异步请求,真正实现页面局部刷新,没有跳转,坐上角小圈圈没转 原生Ajax写法---注意ajax的缩写 3.服务器放回了xml数据格式 解析过程还是很麻烦的,所以这种数据格式很少用了. 4.

正确理解异步分工

背景 一个果园会产出5种水果,ABCDE,每种水果有不同处理方式. 果园每天只采摘一次,每次只采摘一种水果,当天会摘哪一种,会看长势临时决定. 水果种类=事件类型 果农和工人=线程/代码函数 贴纸条=发布消息 看纸条=接收消息 同步方案 果园里只有一个老果农打理,他每天进园采摘一种水果.如果摘到ABC三种水果,他就送到市场上去卖,如果是C水果,在卖的时候还要帮人加工一下.如果摘到D水果,就送隔壁去喂猪,如果是E水果,就带回家榨果汁. 交接 再后来他干不动了,想找个人接班,但是找不到,因为这个人既

深入理解javascript编程中的同步和异步

JavaScript的优势之一是其如何处理异步代码.异步代码会被放入一个事件队列,等到所有其他代码执行后才进行,而不会阻塞线程.然而,对于初学者来说,书写异步代码可能会比较困难.而在这篇文章里,我将会消除你可能会有的任何困惑.理解异步代码 JavaScript最基础的异步函数是setTimeout和setInterval.setTimeout会在一定时间后执行给定的函数.它接受一个回调函数作为第一参数和一个毫秒时间作为第二参数.以下是用法举例: console.log( "a" );

<史上最强>深入理解 Python 异步编程(上)

前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知道如何使用 Tornado.Twisted.Gevent 这类异步框架上,出现各种古怪的问题难以解决.而且使用了异步框架的部分同学,由于用法不对,感觉它并没牛逼到哪里去,所以很多同学做 Web 后端服务时还是采用 Flask.Django等传统的非异步框架. 从上两届 PyCon 技术大会看来,异步编程已经成了 Python 生态下一阶段的主旋律.如新兴的 Go.Rust.

深入理解 Python 异步编程(上)

http://python.jobbole.com/88291/ 前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知道如何使用 Tornado.Twisted.Gevent 这类异步框架上,出现各种古怪的问题难以解决.而且使用了异步框架的部分同学,由于用法不对,感觉它并没牛逼到哪里去,所以很多同学做 Web 后端服务时还是采用 Flask.Django等传统的非异步框架. 从上两届 PyCon 技术大会看来,异步编程已经成

关于python中同步、异步,阻塞、非阻塞的理解

同步.异步,阻塞.非阻塞的理解 异步:某个事情需要10秒.而我只需要调用一个函数帮我做,我可以干 其他的事情.(比如调用celery) 同步:某个事情需要10秒完成,我等他完成之后再继续后面的工作. 举例:金拱门排队取餐 第一种方式(同步),下单拿号之后自己排队取餐. 第二种方式(异步),下单之后可以坐在一旁等待叫号,等待事件触发. 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务,等待当前函数返回. 阻塞调用和同步调用不同点: 对于同步调用来说,很