settimeout

异步编程上篇

懵懂的女人 提交于 2019-12-22 04:31:45
第 16 章异步编程 随着计算机的不断发展,用户对计算机应用的要求越来越高,需要提供更多、更智能、响应速度 更快的功能。这就离不开异步编程的话题。同时,随着互联网时代的崛起,网络应用要求能够支 持更多的并发量,这显然也要用到大量的异步编程。那么从这节课开始,我们会学习到底什么是 异步编程,以及在 JS中如何实现异步编程。 本章我们将学习如下内容: ・什么是异步编程。 •回调和Promise。 • 生成器 Generator。 • ES7中的异步实现Async和Await。 16-1 异步编程概述 16-1-1 什么是异步编程? 我们先来看看到底什么是异步。提到异步就不得不提另外一个概念:同步。那什么又叫同步呢。 很多初学者在刚接触这个概念时会想当然的认为同步就是同时进行。显然,这样的理解是错误 的,咱不能按字面意思去理解它。同步,英文全称叫做 Synchronization 。它是指同一时间只能做 —件事,也就是说一件事情做完了才能做另外一件事。 比如咱们去火车站买票,假设窗口只有1个,那么同一时间只能处理1 个人的购票业务,其余的需 要进行排队。这种 one by one 的动作就是同步。这种同步的情况其实有很多,任何需要排队的情 况都可以理解成同步。那如果在程序中呢,我们都知道代码的执行是一行接着一行的,比如下面 这段代码: let ary = []; for ( let i

世界杯足球下注源码搭建下载

时间秒杀一切 提交于 2019-12-22 04:30:19
世界杯足球下注源码搭建 下载 http://hubawl.com 什么叫异步 异步(async) 是相对于 同步(sync) 而言的,很好理解。 同步 就是一件事一件事的执行。只有前一个任务执行完毕,才能执行后一个任务。而 异步 比如: setTimeout(function cbFn(){ console.log('learnInPro'); }, 1000); console.log('sync things'); setTimeout就是一个 异步任务 ,当JS引擎顺序执行到setTimeout的时候发现他是个异步任务,则会把这个任务挂起,继续执行后面的代码。直到1000ms后,回调函数cbFn才会执行,这就是异步,在执行到setTimeout的时候,JS并不会傻呵呵的等着1000ms执行cbFn回调函数,而是继续执行了后面的代码。 1.2 为啥要在JS中使用异步 由于javascript是 单线程 的,只能在JS引擎的主线程上运行的,所以js代码只能一行一行的执行,不能在同一时间执行多个js代码任务,这就导致如果有一段耗时较长的计算,或者是一个ajax请求等IO操作,如果没有异步的存在,就会出现用户长时间等待,并且由于当前任务还未完成,所以这时候所有的其他操作都会无响应。 1.3 那为啥JS不设计成多线程的 这主要跟javascript的历史有关

Why is an anonymous function required to preserve “this” using setTimeout

戏子无情 提交于 2019-12-22 04:30:14
问题 I've used setTimeout plenty of times passing a function as a reference e.g. setTimeout(someFunction, 3000); In some cases, to preserve the value of this I've had to assign it to a variable before hand, but don't understand why the following does not work: var logger = { log: function() { var that = this; console.log(that.msg); setTimeout(that.log, 3000); }, msg: "test" }; logger.log(); Using an anonymous function however, does work: var logger = { log: function() { var that = this; console

JS异步编程 (1)

大城市里の小女人 提交于 2019-12-22 04:29:59
JS异步编程 (1) 1.1 什么叫异步 异步(async) 是相对于 同步(sync) 而言的,很好理解。 同步 就是一件事一件事的执行。只有前一个任务执行完毕,才能执行后一个任务。而 异步 比如: setTimeout(function cbFn(){ console.log('learnInPro'); }, 1000); console.log('sync things'); setTimeout就是一个 异步任务 ,当JS引擎顺序执行到setTimeout的时候发现他是个异步任务,则会把这个任务挂起,继续执行后面的代码。直到1000ms后,回调函数cbFn才会执行,这就是异步,在执行到setTimeout的时候,JS并不会傻呵呵的等着1000ms执行cbFn回调函数,而是继续执行了后面的代码。 1.2 为啥要在JS中使用异步 由于javascript是 单线程 的,只能在JS引擎的主线程上运行的,所以js代码只能一行一行的执行,不能在同一时间执行多个js代码任务,这就导致如果有一段耗时较长的计算,或者是一个ajax请求等IO操作,如果没有异步的存在,就会出现用户长时间等待,并且由于当前任务还未完成,所以这时候所有的其他操作都会无响应。 1.3 那为啥JS不设计成多线程的 这主要跟javascript的历史有关,js最开始只是为了处理一些表单验证和DOM操作而被创造出来的

什么是 Event Loop?

不问归期 提交于 2019-12-22 04:29:19
摘自:http://www.ruanyifeng.com/blog/2014/10/event-loop.html 一、为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。 JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准? 所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。 为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。 二、任务队列 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。 如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多时候CPU是闲着的,因为IO设备(输入输出设备

javascript事件轮询

雨燕双飞 提交于 2019-12-22 04:28:50
JavaScript 运行机制详解:再谈Event Loop 一、为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。 JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准? 所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。 为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。 二、任务队列 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。 如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多时候CPU是闲着的,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据)

Wait for function till user stops typing

坚强是说给别人听的谎言 提交于 2019-12-22 04:08:02
问题 I have users making ajax call while typing. The problem is that it makes the call for every letter being typed, so I set timeout like this: $(input).live('keyup', function(e){ setTimeout(function(){ var xx = $(input).val(); doSearch(xx); }, 400); }); It does wait for 400ms but then executes for every keyup. How can I change this to make the ajax call only 'once' about 400ms after the last typed letter? (I used 'delay' in the past but that doesn't work at all with my script...) 回答1: timer = 0;

Why does Underscore.js have a delay function?

女生的网名这么多〃 提交于 2019-12-22 02:59:23
问题 This is the source code for Underscore.js' delay function: _.delay = function (func, wait) { var args = slice.call(arguments, 2); return setTimeout(function () { return func.apply(null, args); }, wait); }; How is this any different from setTimeout ? Why does Underscore.js need delay ? 回答1: It's a cross browser way of being able to pass extra arguments which will appear as the arguments to the callback, like setTimeout() . This doesn't work in IE. It can make your code prettier... setTimeout(_

js: 从setTimeout说事件循环模型

♀尐吖头ヾ 提交于 2019-12-21 23:53:20
一、从setTimeout说起   setTimeout()方法不是ecmascript规范定义的内容,而是属于BOM提供的功能。查看w3school对setTimeout()方法的定义,setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。   语法setTimeout(fn,millisec),其中fn表示要执行的代码,可以是一个包含javascript代码的字符串,也可以是一个函数。第二个参数millisec是以毫秒表示的时间,表示fn需推迟多长时间执行。   调用setTimeout()方法之后,该方法返回一个数字,这个数字是计划执行代码的唯一标识符,可以通过它来取消超时调用。   起初我对 setTimeout()的使用比较简单,对其运行机理也没有深入的理解,直到看到下面代码 1 var start = new Date; 2 setTimeout(function(){ 3 var end = new Date; 4 console.log('Time elapsed:', end - start, 'ms'); 5 }, 500); 6 while (new Date - start < 1000) {};   在我最初对setTimeout()的认识中,延时设置为500ms,所以输出应该为Time elapsed: 500 ms。因为在直观的理解中

Javascript异步编程之setTimeout与setInterval详解分析(一)

此生再无相见时 提交于 2019-12-21 23:53:08
Javascript异步编程之setTimeout与setInterval 在谈到异步编程时,本人最主要会从以下三个方面来总结异步编程( 注意: 特别解释:是总结,本人也是菜鸟,所以总结不好的,请各位大牛多多原谅!) 1. setTimeout与setInterval详细分析基本原理。 2. 分布式事件(pub/sub). 3. Promise对象和Deferred对象。 接下来这篇博客会总结setTimeout和setInterval基本点,对于上面三点会分三篇博客分别来总结,对于知道上面三点的人,但是又不是非常了解全面知识点的码农来说,没有关系的,我们可以慢慢来学习,来理解,或者我总结不全面的或者不好地方可以留言,学习本来就是要互动,才有提高。当然对于那些知识大牛来说,也可以看下,如果我总结不好的话,也可以提提意见,我也可以多学习学习下! 在研究setTimeout与setInterval之前,我们可以先来看看一个小小的demo,其实总结与研究就是要多做demo,因为有的事情我们看起来很简单,真正做起来的时候不是那么一回事。比如如下: for(var i = 1; i <= 3; i++) { setTimeout(function(){ console.log(i); },100); } 如果javascript语言不是很熟悉的话