回调函数

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操作从网络读取数据)

node.js的事件轮询机制

荒凉一梦 提交于 2019-12-22 00:05:37
借助libuv库实现的 概括事件轮询机制:分为六个阶段 1.timers 定时器阶段 计时和执行到点的定时器回调函数 2.pending callbacks 某些系统操作(例如TCP错误类型) 3.idle,prepare 4.poll轮询阶段(轮询队列) 如果轮询队列不为空,依次同步取出轮询队列中第一个回调函数,直到轮询队列为空或者达到系统最大限制 如果轮询队列为空 如果之前设置过setImmediate函数,直接进入下一个check阶段,如果之前没有设置过setImmediate函数,在当前 poll阶段等待,直到轮询队添加回调函数,就会去第一个情况执行,如果定时器到点了,他也会去下一个阶段 5.check查阶段 执行setImmediate设置的回调函数 6.close callbacks关闭阶段 close事件回调函数 process.nextTick()的意思就是定义出一个动作,pengd并且让这个动作在下一个事件轮询的时间点上执行。能在任意阶段优先执行 来源: 51CTO 作者: 喝醉的熊 链接: https://blog.51cto.com/13550695/2460599

什么是跨域

为君一笑 提交于 2019-12-21 18:56:22
1.同源策略 是浏览器的安全策略 协议名、域名、端口号必须一致 2.跨域 违背了同源策略就会产生跨域 3.解决跨域 jsonp cors 服务器代理模式 第一步 创建script标签 var script = docuemnt.createElement("script") 第二步 设置回调函数 fuction getData(data){ //数据请求回来会被触发的函数 consol.log(data) } 第三步 设置script标签的src属性 设置请求地址 script.src = "http://localhost:3000?callback=getData" 第四步 让script 标签生效 document.body.appendChild(script) 来源: 51CTO 作者: 喝醉的熊 链接: https://blog.51cto.com/13550695/2460639

Inside Flask - app.py - 2

不打扰是莪最后的温柔 提交于 2019-12-21 09:03:29
Inside Flask - app.py - 2 Flask 初始化参数 Flass 类是 Flask 框架的核心,一个 flask 对象处理视图函数注册、URL规则、模板配置、参数设置等等。 一般地, Flask 在使用时,先创建一个 flask 对象: from flask import Flask app = Flask(__name__) 除此之后, Flask 的初始化支持更多的参数,其完整的函数签名为: def __init__(self, import_name, static_path=None, static_url_path=None, static_folder='static', template_folder='templates', instance_path=None, instance_relative_config=False) 这些参数里面,可能最需要说明的是 import_name 。一般地,在单模块方式(即只使用一个文件包含全部代码)下使用 Flask , import_name 参数会使用 __name__ 。而 Flask 建议,以 package 的方式使用 Flask (即 yourapplication/app.py 形式, yourapplication 包内包含其它 Flask 相关代码),就应该采用硬编码的

vue2.0 正确理解Vue.nextTick()的用途

谁说我不能喝 提交于 2019-12-21 07:12:38
什么是Vue.nextTick() 官方文档解释如下: 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。 获取更新后的DOM,言外之意就是DOM更新后再执行的操作;比如Swiper的调用 new Swiper ('.swiper-container', { direction: 'horizontal', pagination : '.swiper-pagination', loop: true, observer: true, // 修改swiper自己或子元素时,自动初始化swiper observeParents: true,// 修改swiper的父元素时,自动初始化swiper autoplay: 1000, autoplayDisableOnInteraction: false }); 什么时候需要用到Vue.nextTick() 在Vue生命周期的 created() 钩子函数进行的DOM操作一定要放在 Vue.nextTick() 的回调函数中。原因是在 created() 钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将DOM操作的js代码放进 Vue.nextTick() 的回调函数中。 与之对应的就是 mounted 钩子函数

[原]tornado源码分析系列(六)[HTTPServer详解]

强颜欢笑 提交于 2019-12-20 04:24:06
引言:上一章讲了关于HTTPServer的原理,这一次通过分析源码来了解更多的细节 看看HTTPServer类的组织结构: HTTPServer的主要工作 一.提供了一些基础的比如说listen,bind此类共有操作 二.完成了一个 _handle_events()的公有回调函数,此函数是 IOLoop的基础,此函数为每一个连接创建一个单独的 IOStream 对象 三.start函数,启动HTTPServer,并设置相应的参数(如根据CPU个数来设置进程数等) 从HTTPServer类的构造函数可以看出,最重要的参数是设置回调函数,此回调函数用于处理request对象 每次有HTTP的请求,都会通过HTTPConnection 封装一个HTTPRequest对象,这个对象包含了HTTP请求的所有信息 所以在HTTPServer层,需要对这个对象进行一番处理后调用 request.write将结果返回给客户端 此回调函数会先注册到HTTPServer,然后注册到HTTPConnection 里面,因为request这个对象是由HTTPConnection对象产生 def _handle_events(self, fd, events): while True: try: connection, address = self._socket.accept() except

python2x与3x下使用urlretrieve下载文件

北战南征 提交于 2019-12-19 22:36:23
1、python2x下urlretrieve方法: 直接将远程数据下载到本地。 urllib.urlretrieve(url[, filename[, reporthook[, data]]]) 参数说明: url:外部或者本地url filename:指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据); reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函数来显示当前的下载进度。 data:指post到服务器的数据。该方法返回一个包含两个元素的元组(filename, headers),filename表示保存到本地的路径,header表示服务器的响应头。 下面通过例子来演示一下这个方法的使用,这个例子将新浪首页的html抓取到本地,保存在D:/sina.html文件中,同时显示下载的进度。 import urllib def callbackfunc(blocknum, blocksize, totalsize): '''回调函数 @blocknum: 已经下载的数据块 @blocksize: 数据块的大小 @totalsize: 远程文件的大小 ''' percent = 100.0 * blocknum * blocksize / totalsize if percent

浅谈setTimeout和setInterval

∥☆過路亽.° 提交于 2019-12-19 15:31:07
最近阅读了相关setTimeout和setInterval的相关文档,受益匪浅,在这里贴出链接分享。 首先是这篇腾讯alloyteam团队的文章,关于setTimeout的事件循环机制讲的非常清楚。 http://www.alloyteam.com/2015/10/turning-to-javascript-series-from-settimeout-said-the-event-loop-model/ 然后是国外的一片读物: http://ejohn.org/blog/how-javascript-timers-work/ 中文翻译: https://segmentfault.com/a/1190000002633108 接下来是一些自己的理解。不正确之处还望指正。        setInterval(function(){ //need long time },500) 当回调函数执行需要很长的时间时,不论有没有执行完,到了500ms,都会向任务队列中又加入这个回调函数。也就是说如果回调函数执行需要2s中,那么在执行完这个回调函数中,任务队列中会新增4个执行回调函数的任务,当然每个任务执行又需要花费2s,这样又会多出4个,这样就会造成任务堆叠。所以在下面代码中你可以看到上一个回调任务结束时间基本同下一个回调任务开始时间一致。        var t=setInterval

JQuery跳出each循环的方法

巧了我就是萌 提交于 2019-12-19 09:42:07
一、jquery each循环,要实现break和continue的功能: break----用return false; continue --用return ture; 二、jquery怎么跳出当前的each循环 有些朋友可能会以为在jquery跳出循环可以直接使用continue和break了,但是使用之后没有效果,因为在jquery中没有这两条命令。 后来上网查了下,得到了结果: return false;——跳出所有循环;相当于 javascript 中的 break 效果。 return true;——跳出当前循环,进入下一个循环;相当于 javascript 中的 continue 效果 例 复制代码 代码如下: $(function (){ $("input[type='text']").each(function (i){ var _val=$(this).val(); alert(_val); if(_val=='2'){ return false; //跳出循环 } }) }); 三、Jquery each方法跳出循环并获得返回值的方法 return false:将停止循环 (就像在普通的循环中使用 'break')。 return true:跳至下一个循环(就像在普通的循环中使用'continue')。 复制代码 代码如下: function test(){

Socket网络编程--Libev库学习(3)

僤鯓⒐⒋嵵緔 提交于 2019-12-19 09:00:33
  这一小节继续讲解各个观察器(Watcher).   上一小节已经讲解了ev_io(IO可读可写观察器),ev_stat(文件属性变化观察器),ev_signal(信号处理观察器),ev_timer(定时器),ev_periodic(周期任务处理),ev_child(子进程状态变化观察器)。这一小节准备讲ev_fork(创建的进程时的观察器),ev_async(异步调用观察器),ev_cleanup(event loop退出时触发事件),ev_prepare(每次event loop之前事件),ev_check(每次event loop之后事件),ev_idle(每次event loop空闲触发事件).   ev_async (ev_async当ev_async_send通过watcher调用时调用,触发EV_ASYNC) 1 #include <stdio.h> 2 #include <string.h> 3 #include <unistd.h> 4 #include <stdlib.h> 5 #include <ev.h> 6 7 ev_async async_watcher; 8 9 static void sigint_callback(struct ev_loop *loop,ev_signal * w,int revents) 10 { 11 if(revents