settimeout

Javascript中的异步编程

人走茶凉 提交于 2020-02-26 09:06:15
Javascript最开始是用于浏览器中的前端编程语言。Javascript是单线程的,为了能及时响应用户操作,javascript对耗时操作(如Ajax请求、本地文件读取等)的处理是异步进行的,也即是所谓的异步编程。除了快速响应用户操作之外,另外一个让javascript采用异步方式的原因是,程序无法预知用户会进行哪些操作。比如说程序无法提前知道用户是点“取消”按钮还是“确定”按钮。所以,Javascript采用了事件注册的方式来处理这个问题。在程序编写时,可以给用户点击“取消”按钮和“确认”按钮注册不同的回调函数,这样当用户点击不同的按钮时,不同的回调函数会被执行。本文从回调函数开始,介绍了Promise、async/await几种Javascript主要的异步编程方式。 异步编程和回调函数 无论是Ajax请求,还是事件处理,Javascript都是通过回调函数来完成的。谈及异步编程和回调函数,可以回想一下操作系统中的中断及中断处理程序。由于CPU的速度比外设快出许多,为了提高CPU的处理效率,计算机系统引入了中断的概念,外设在读写数据的时候,CPU可以忙别的事情,等到外设读写完数据后,会给CPU发一个中断信号,CPU就可以来执行已经注册好的、相应的中断处理程序。Javascript中的回调函数和中断处理程序都是类似的原理。 先来看一个异步的例子: console.log(

rxjs6 Multicasting Operators & Error Handling Operators

被刻印的时光 ゝ 提交于 2020-02-25 21:22:03
Multicasting Operators multicast 多次订阅, 后订阅的数值依然是从头开始的 let s = interval(300) s.subscribe(v => console.log('s1', v)) setTimeout( () => s.subscribe(v => console.log('s2', v)), 1000 ) // s1 0 // s1 1 // s1 2 // s1 3 // s2 0 // s1 4 // s2 1 // s1 5 multicast 连接多个订阅对象, 使其即使不在同一时间订阅, 也能收到同样的值 let s = interval(300).pipe(multicast(() => new Subject())) s.connect() s.subscribe(v => console.log('s1', v)) setTimeout( () => s.subscribe(v => console.log('s2', v)), 1000 ) // s1 0 // s1 1 // s1 2 // s1 3 // s2 3 // s1 4 // s2 4 // s1 5 publish multicast 简写 let s = interval(300).pipe(publish()) s.connect() s

Accuracy of setTimeout in React Native

こ雲淡風輕ζ 提交于 2020-02-24 07:04:50
问题 I'm building a metronome in React Native. After playing a click, I set a setTimeout for the next click. The timing however, is awful. I did the following quick test: let time = (new Date()).getTime() + 50; setTimeout(() => { console.log(time - (new Date()).getTime()); }, 50) Ideally, I should get 0 in the console. While running this outside React Native in Chrome Dev Tools, I get -1, sometimes -2 (ms). This is an acceptable result. Running this inside React Native using the Simulator on macOS

用setTimeout实现setInterval函数

纵饮孤独 提交于 2020-02-23 09:05:23
最近get一个新知识,也不算是新知识,可能是以前自己没有认真对待(对自己无语ing,si不si傻)。 废话不多说,直接来看代码吧 function setInterval(func, t){ var inter = function(){ setTimeout(inter,t); try{ func.call(null); } catch(e){ throw e.toString(); } } setTimeout(inter,t);}; 函数中有一个叫inter的内部函数,通过setTimeout来自动被调用,inter中形成了一个闭包,检查了重复的次数,调用回调函数并通过setTimeout再次调用了inter。当回调函数中出现了一个异常,inter调用将会终止,并抛出异常。(简单来说就是使用闭包+回调+setTimeout就可以实现咱们js封装好的setInterval函数啦。)咱们来测试一下: setInterval(function(){ //执行的代码 console.log("test");},1000); 打开你的控制台,看一下吧,是不是每隔1秒就输出一个test了呢,嘻嘻。好了,小女子要去看书了,感觉自己对一些东西还是理解的不够透彻,得好好看看书补补脑了,拜~ 引用资料:http://www.thecodeship.com/web-development

深入理解 JavaScript 事件循环(一)— event loop

限于喜欢 提交于 2020-02-18 22:04:56
引言   相信所有学过 JavaScript 都知道它是一门单线程的语言,这也就意味着 JS 无法进行多线程编程,但是 JS 当中却有着无处不在的 异步 概念 。在初期许多人会把异步理解成类似多线程的编程模式,其实他们中有着很大的差别,要完全理解异步,就需要了解 JS 的运行核心—— 事件循环(event loop) 。在之前我对事件循环的认识也是一知半解的,直到我看了 Philip Roberts 的演讲 What the heck is the event loop anyway? ,我才对事件循环有了一个全面的认识,所以我想写一篇介绍 JS 事件循环的文章,以供大家学习和参考。 一、为什么会有异步?   为什么 JS 当中会有异步?我们想象一下,如果我们同步的执行一下代码会发生什么: 1 $.get(url, function(data) { 2 //do something 3 });   在我们使用 ajax 进行通信的时候,我们都默认了它是异步的,但是如果我们设置其为同步执行,会发生什么?如果你自己写一个小的测试程序,将后台代码延迟5s你会发现浏览器会出现阻塞,直到 ajax 响应了之后才会正常运行。这便是异步模式要解决的首要问题,如何使浏览器非阻塞的运行任务。想象一下如果我们同步的执行 ajax 请求的话,我们的等待的时间是一个未知数,在网络通信中可能很快也可能很慢

Js同步异步机制

半城伤御伤魂 提交于 2020-02-18 21:28:03
JavaScript引擎是单线程的,强制所有的异步事件排队等待执行 setTimeout 和 setInterval 在执行异步代码的时候有着根本的不同 如果一个计时器被阻塞而不能立即执行,它将延迟执行直到下一次可能执行的时间点才被执行(比期望的时间间隔要长些) 如果 setInterval 回调函数的执行时间将足够长(比指定的时间间隔长),它们将连续执行并且彼此之间没有时间间隔 animate因为内部利用的实际是 setInterval $(function(){ for(var i=0;i<10;i++){ $("div").animate({left:'100px',top:'0px'},1000,'swing',function({ $("div").animate({left:'100px',top:'0px'},1000,'swing'); console.log(2) })); console.log(1) } }) 会先打印10次 1 然后执行animate内容一次,打印10次2,最后执行剩下的9次animate 若有嵌套层级关系,则根据依次排队顺序读取运行 来源: https://www.cnblogs.com/lwboke/p/6938008.html

for 循环中setTimeout(function () { console.log(i)},100)中的异步问题

ⅰ亾dé卋堺 提交于 2020-02-17 09:04:46
for(var i=0;i<=3;i++){ setTimeout(() => { console.log(i) }, 1000); } //四次4 这道题涉及了异步、作用域、闭包 settimeout是异步执行,10ms后往任务队列里面添加一个任务,只有主线上的全部执行完,才会执行任务队列里的任务,当主线执行完成后,i是4,所以此时再去执行任务队列里的任务时,i全部是4了。对于打印4次是: 每一次for循环的时候,settimeout都执行一次,但是里面的函数没有被执行,而是被放到了任务队列里面,等待执行,for循环了4次,就放了4次,当主线程执行完成后,才进入任务队列里面执行。(注意:for循环从开始到结束的过程,需要维持几微秒或几毫秒。) 当我把var 变成let 时 for(let i=0;i<=3;i++){ setTimeout(() => { console.log(i) }, 2000); } // 0,1,2 当解决变量作用域,因为for循环头部的let不仅将i绑定到for循环快中,事实上它将其重新绑定到循环体的每一次迭代中,确保上一次迭代结束的值重新被赋值。setTimeout里面的function()属于一个新的域,通过 var 定义的变量是无法传入到这个函数执行域中的,通过使用 let 来声明块变量,这时候变量就能作用于这个块,所以 function就能使用

JavaScript 异步处理(ES6)

感情迁移 提交于 2020-02-16 12:58:45
一、Promise 是什么? 不是讲 async/await 吗?为什么会提到 Promise ? 实际上, async/await 是 Promise 的一个拓展,所以,想要更好地理解 async/await ,需要先理解 Promise 。 我们先看看 Promise 是什么。先在浏览器中使用 console.dir(Promise) 打印出 Promise 对象的所的属性和方法: 从打印结果可以看出, Promise 是一个构造函数,它自己本身有 all 、 reject 、 resolve 等方法,原型上有 catch 、 finally 、 then 等方法。所以 new 出来的 Promise 对象也就自然拥有 catch 、 finally 、 then 这些方法。从上图中可以看到, then 方法返回的是一个新的 Promise 实例(注意,不是原来那个 Promise 实例)。因此可以采用链式写法,即 then 方法后面再调用另一个 then 方法。 Promise 的中文意思是承诺,这种**“承诺将来会执行”**的对象在 JavaScript 中称为 Promise 对象。简单说就是一个容器,里面保存着某个未来才会执行的事件(通常是一个异步操作)的结果。 Promise 对象有两个特点: 对象的状态不受外界影响。 Promise 对象代表一个异步操作,有三种状态

setTimeout 和 setInterval 计时的区别

北慕城南 提交于 2020-02-13 17:07:40
window对象有两个主要的定时方法,分别是setTimeout 和 setInteval 他们的语法基本上相同,但是完成的功能取有区别。 setTimeout方法是定时程序,也就是在什么时间以后干什么。干完了就拉倒。 setInterval方法则是表示间隔一定时间反复执行某操作。 如果用setTimeout实现setInerval的功能,就需要在执行的程序中再定时调用自己才行。如果要清除计数器需要 根据使用的方法不同,调用不同的清除方法: 例如:(1): t=setTimeout('northsnow()',1000); clearTimeout(t); (2): t=setInterval('northsnow()',1000); clearInteval(t); setTimeout() 语法 var t=setTimeout("javascript语句",毫秒); 第一个参数是含有 JavaScript 语句的字符串。这个语句可能诸如 "alert('5 seconds!')",或者对函数的调用,诸如 alertMsg()"。 第二个参数指示从当前起多少毫秒后执行第一个参数。 提示:1000 毫秒等于一秒。 实例 当下面这个例子中的按钮被点击时,一个提示框会在5秒中后弹出。 <html> <head> <script type="text/javascript">

打老壳的闭包知识

会有一股神秘感。 提交于 2020-02-12 05:46:59
猜猜下面代码输出什么? for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i,'b'); }, 1000); console.log(i,'c') } console.log(i,'a'); 我猜不到啊。。。然后就从一个大神那儿学习了。 答案是: 分析: 由于setTimeout()实现异步的机制,代码 console.log(i,'b'); 被指定到1s后执行,程序会先执行完 console.log(i,'c'); 和 console.log(i,'a') ;等他们执行完后再执行 console.log(i,'b'); 一、首先,要知道setTimeout()的运行机制: setTimeout运行机制 setTimeout()和setInterval()的运行机制是,将指定的代码移出本次执行,等到下一轮Event Loop时,再检查是否到了指定时间。如果到了,就执行对应的代码;如果不到,就等到再下一轮Event Loop时重新判断。这意味着,setTimeout()指定的代码,必须等到本次执行的所有代码都执行完,才会执行。 Event Loop 主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环); 举栗子: test1();