JQuery日记6.5 Javascript异步模式(一)

理解力JQuery前实现异步队列,有必要理解javascript异步模式.

Javascript异步其实并不严重格异步感,js使某些片段异步方式在将来运行,流不必等待继续向下进行.

在多线程的语言中最easy想到的异步方式就是在当前线程中,新创建一个线程让某段代码片段执行在新创建的线程中,从而使当前线程继续向下进行.

而不论什么一本书关于js的书都会告诉我们js是执行在单线程里的,这个线程称为UI线程,从名字就知道这个线程不光用于执行js代码,还负责事件的处理和UI的绘制.

在游览器内部维护着一个事件队列,触发的事件会一个个的放进这个队列中,UI线程在空暇时会去查看这个队列,假设队列不为空,就取第一个事件并运行其监听函数.

for (var i = 0; i < 3; ++i) {
    setTimeout( function(){
         console.info( 'setTimeout: ' + i);
    }, 0);
    console.info( 'for循环: ' + i)
}

上面这段代码在UI线程的运行示意图图例如以下

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc29uZ3poZW5nXzc0MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

首先将此段js代码放进UI线程中运行,当代码运行到setTimeout(fn, mills)时,游览器会在事件队列中放入此定时事件1,前面说过仅仅有当UI线程空暇时才会去运行定时事件,但此时js代码还在运行,所以继续for循环,i继续自增,而且继续放入定时事件2,3,当js代码片段运行完成后,才继续依次运行定时事件1、2、3,此时i的值已经是3了.所以在控制台中我们看到的打印结果依次是:setTimeout:1,setTimeout:2,setTimeout:3,for循环:3,for循环:3,for循环:3.

事实上这样看起来很类似与传统多线程的异步编程,代码运行流并不会等setTimeout的函数运行完成,再继续向下运行.但我们要了解的是,事实上它们仍然是串行运行的,仅仅只是是把setTimeout中设置的函数放到队列中延后运行,从而使js代码依旧先运行,运行完成后再依次运行事件队列中的性能.

版权声明:本文博主原创文章。博客,未经同意不得转载。

时间: 2024-10-26 19:41:59

JQuery日记6.5 Javascript异步模式(一)的相关文章

JQuery日记6.5 Javascript异步模型(二)

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

JQuery日记6.5 Javascript异步模型(一)

在了解JQuery的异步队列实现之前,有必要去了解javascript的异步模型. Javascript的异步其实并不算严格意义上的异步,js的异步是指让某段代码片段在将来再执行,而不是让执行流不必等待继续向下进行. 在多线程的语言中最容易想到的异步方式就是在当前线程中,新创建一个线程让某段代码片段运行在新创建的线程中,从而使当前线程继续向下进行. 而任何一本书关于js的书都会告诉我们js是运行在单线程里的,这个线程称为UI线程,从名字就知道这个线程不光用于运行js代码,还负责事件的处理和UI的

可以用作javascript异步模式的函数写法

1. 回调函数 f1(); f2(); function f1(callback) { setTimeout(function() { // f1的任务代码 callback(); }, 1000); } f1(f2);  2. 事件监听 f1.on('done', f2); function f1() { setTimeout(function() { // f1的任务代码 f1.trigger('done'); }, 1000); }  3. 发布 / 订阅 jQuery.subscribe

javascript异步代码的回调地狱以及JQuery.deferred提供的promise解决方式

我们先来看一下编写AJAX编码常常遇到的几个问题: 1.因为AJAX是异步的,全部依赖AJAX返回结果的代码必需写在AJAX回调函数中.这就不可避免地形成了嵌套.ajax等异步操作越多,嵌套层次就会越深.代码可读性就会越差. $.ajax({ url: url, data: dataObject, success: function(){ console.log("I depend on ajax result."); }, error: function(){} }); consol

javascript异步代码的回调地狱以及JQuery.deferred提供的promise解决方案

我们先来看一下编写AJAX编码经常遇到的几个问题: 1.由于AJAX是异步的,所有依赖AJAX返回结果的代码必需写在AJAX回调函数中.这就不可避免地形成了嵌套,ajax等异步操作越多,嵌套层次就会越深,代码可读性就会越差. $.ajax({ url: url, data: dataObject, success: function(){ console.log("I depend on ajax result."); }, error: function(){} }); consol

JavaScript异步编程助手:Promise模式 【转】

异步模式在Web编程中变得越来越重要,对于Web主流语言JavaScript来说,这种模式实现起来不是很利索,为此,许多 JavaScript库(比如 jQuery和Dojo.AngularJS)添加了一种称为Promise的抽象(术语称作Deferred模式).通过这些库,开发人员能够在实际编 程中使用Promise模式,每个Promise都拥有一个叫做then的唯一接口,当Promise失败或成功时,它就会进行回调.它代表了一种可能会 长时间运行而且不一定必须完成的操作结果.这种模式不会阻塞

Javascript异步编程的4种方法

转自 阮一峰 http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html 作者: 阮一峰 日期: 2012年12月21日 你可能知道,Javascript语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推. 这种模式的好处是实现起来比较简单,执行环境

JavaScript异步编程设计快速响应的网络应用

JavaScript已然成为了多媒体.多任务.多内核网络世界中的一种单线程语言.其利用事件模型处理异步触发任务的行为成就了JavaScript作为开发语言的利器.如何深入理解和掌握JavaScript异步编程变得尤为重要!!!<JavaScript异步编程设计快速响应的网络应用>提供了一些方法和灵感. 一.深入理解JavaScript事件 1. 事件的调度 JavaScript事件处理器在线程空闲之前不会运行(空闲时运行). var start = new Date(); setTimeout

前端基本知识(四):JS的异步模式:1、回调函数;2、事件监听;3、观察者模式;4、promise对象

JavaScript语言将任务的执行模式可以分成两种:同步(Synchronous)和异步(Asychronous). “同步模式”就是一个任务完成之后,后边跟着一个任务接着执行:程序的执行顺序和排列顺序是一直的:”异步模式”则完全不同,每一个任务都有一个或者多个回调函数(callback),前一个任务结束的时候,不是执行下一个任务,二十执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务顺序不一致的,异步的. 在浏览器端,耗时时间长的操作都应该异步执行,避免浏览器数去