回调函数

js处理异步的几种方式

霸气de小男生 提交于 2019-12-01 10:09:28
一、回调函数 优点:简单,方便,易用 缺点:易造成回调函数地狱,回调函数中嵌套多个回调函数,因为多个异步操作造成强耦合,代码乱做一团,无法管理。 var xhr1 = new XMLHttpRequest(); xhr1.open('GET', 'https://www.apiopen.top/weatherApi?city=广州'); xhr1.send(); xhr1.onreadystatechange = function() { if(this.readyState !== 4) return; if(this.status === 200) { data1 = JSON.parse(this.response); var xhr2 = new XMLHttpRequest(); xhr2.open('GET', 'https://www.apiopen.top/weatherApi?city=番禺'); xhr2.send(); xhr2.onreadystatechange = function() { if(this.readyState !== 4) return; if(this.status === 200) { data2 = JSON.parse(this.response); console.log(data1, data2); } } } };   二

vue 源码解析computed

戏子无情 提交于 2019-12-01 09:45:33
计算属性 VS 侦听属性 Vue 的组件对象支持了计算属性 computed 和侦听属性 watch 2 个选项,很多同学不了解什么时候该用 computed 什么时候该用 watch 。先不回答这个问题,我们接下来从源码实现的角度来分析它们两者有什么区别。 # computed 计算属性的初始化是发生在 Vue 实例初始化阶段的 initState 函数中,执行了 if (opts.computed) initComputed(vm, opts.computed) , initComputed 的定义在 src/core/instance/state.js 中: const computedWatcherOptions = { computed: true } function initComputed (vm: Component, computed: Object) { // $flow-disable-line const watchers = vm._computedWatchers = Object.create(null) // computed properties are just getters during SSR const isSSR = isServerRendering() for (const key in computed) { const

给单片机写个回调函数怎么样

余生颓废 提交于 2019-12-01 09:22:14
一,弄个串口回调 (实际上就是函数指针...) void(*UsartCallBack)(char data);//定义一个函数指针变量 void UsartCallBackReg(void* Back) { UsartCallBack = Back;//把传过来的指针赋值给 UsartCallBack } USART_C_ void(*UsartCallBack)(char data); void UsartCallBackReg(void* Back); 实际上就是定义了一个 void(*UsartCallBack)(char data);//定义一个函数指针变量 然后我把一个函数指针赋值给他 他呢在串口里面调用!!!! 其实直接可以 测试: 然后呢,写个看着有点水平的 typedef void(*UsartCallBack)(char data);//定义一个函数指针类型 UsartCallBack void UsartCallBackReg(UsartCallBack Back); UsartCallBack CallBack;//定义一个无返回值,带一个参数的函数指针变量 void UsartCallBackReg(UsartCallBack Back) { CallBack = Back; } 然后主函数 测试 来源: https://www.cnblogs.com

matlab学习笔记7-定时器

…衆ロ難τιáo~ 提交于 2019-12-01 08:52:25
一起来学matlab-matlab学习笔记7-定时器 觉得有用的话,欢迎一起讨论相互学习~ Follow Me 参考书籍 《matlab 程序设计与综合应用》张德丰等著 感谢张老师的书籍,让我领略到matlab的便捷 注意:定时器不是指 计时器 使用MATLAB定时器的步骤如下: (1)创建定时器对象。 (2)设置定时器,包括定时器的触发事件与其他属性。 (3)启动定时器对象。 (4)删除定时器对象。 设计简单的定时器 定时器创建 读取和设置定时器属性 定时器对象有很多属性,这些属性反映了定时器当期的状态和控制信息。 读取定时器属性 读取定时器的某个属性,可以使用get函数或者ObjectName.Property的方法读取。下面代码使用get函数来读取ExecuionMode属性。 设置定时器属性 与读取定时器属性的方法相对应,使用set函数或者ObjectName.Properties可以设置定时器属性。此外,也可以创建定时器的同时设置定时器属性 用两种方法来设置定时器的属性 用set函数可查看可设置的属性(有些属性是只读的),只用定时器作参数,将返回所有可以用set函数来设置的属性。如返回一下创建的定时器t: 启动与停止定时器 启动定时器有两种方式,一是定时器启动后按秒计时,另一种按特定的时间来计时,比如一个小时、一天。前者可直接用start函数来启动。 另外,在启动定时器后

爬虫4:单线程+多任务的异步协程,selenium的基本使用,基于js加密和混淆的案列

谁都会走 提交于 2019-12-01 08:40:44
1.单线程+多任务的异步协程 特殊函数: 如果一个函数的定义被asyncio修饰后,则该函数就成了一个特殊的函数。 协程: 就是一个协程对象。特殊函数调用的返回就是协程对象。 特殊函数被调用后,函数内部的实现语句不会被立即执行,然后该函数调用就会返回一个协程对象。 特殊函数的调用的返回 == 协程对象。 任务对象(只是在爬虫里面才会有任务对象): 其实就是对协程对象的进一步封装。 结论: 任务对象,就是一个高级的协程对象 任务对象 == 高级的协程对象 == 特殊函数调用的返回 为什么要使用任务对象? 因为任务对象可以绑定回调函数,协程对象和特殊的函数都没有回调函数 事件循环对象:是整个异步中的重要操作,没有它就实现不了异步 作用:将其内部注册的任务对象进行异步执行。  使用单线程+多任务的异步协程的编码流程    1.定义特殊函数    2.创建协程对象    3.封装任务对象    4.创建事物循环对象    5.将任务对象注册到事物循环对象并且开启循环对象 2.代码实现 import asyncio import time from time import sleep start = time.time() # 函数调用 async def get_request(url): # 加上async之后,在调用特殊函数的时候,里面的代码不会被执行,但是会返回一个coroutine

spider类

与世无争的帅哥 提交于 2019-12-01 07:56:08
1.主要用到的函数及调用的顺序为: __init__():初始化爬虫名字,和start_urls列表 start_requests()调用make_requests_from_url():生成request对象交给scrapy下载并返回response parse():解析response,并返回Item或requests(需指定回调函数)。Item传给Item pipeline持久化,而requests交由scrapy下载,并由指定的回调函数处理,一直循环,直到处理完所有的数据。 dont_filter=True会忽略域组的限制(就是忽略http加入host主机的一部分,域名中没有http) parse()方法的工作机制 1.因为使用的yield而不是return,parse函数会被当作一个生成器使用,scrapy会逐一获取parse方法中生成的结果,并判断该结果是什么类型 2.如果request则加入爬取队列,如果是item类型则使用pipeline处理,其他类型则返回错误信息 3.scrapy取到第一部分的request不会立马去发送这个request,只是把这个request放到队列里,然后接着从生成器里获取 4.取尽request,再获取第二部分的item,就会放到对应的pipeline处理 5.parse()方法作为回调函数callback赋值给了request

antDesign中排序sorter的坑

笑着哭i 提交于 2019-12-01 07:55:52
antd中sorter是写在columns中的一个配置,结果为一个回调函数 如图,这是我项目中使用sorter的小例子,参数a,b分别为列表第0项数据和第1项数据。回调函数中return一个值,按照什么排序就return什么,跟js中的sort一样。 但是一旦触发这个事件,标签内部的分页部分onChange函数就会触发,如图 这是分页器中页码改变的函数,在这个回调函数中接受两个参数,一个是page,另一个是pageSize,但当sorter函数出发的时候,这个pageSize函数也会触发,触发之后pageSize就变成了undefined,所以如果用到pageSize就会出现bug, 我是将pageSize储存在了state中,在这个函数中读取一下stage中的pageSize,如果参数中pageSize不存在就用stage中的pageSize 来源: https://www.cnblogs.com/ayujun/p/11671043.html

怎样给回调函数绑定this

跟風遠走 提交于 2019-12-01 07:45:39
在三种绑定this的方法中, Function.prototype.call() 和 Function.prototye.apply() 都是会立即执行该函数的, 但回调函数是不能立即执行的, 它只是将函数体传进去即可. 因此就需要使用 Function.prototype.bind() 方法. var obj = { name: "Lilei", callbackFunc: function (){ console.log(this.name); } }; setTimeout(obj.callbackFunc.bind(obj),2000); // 2s后显示"Lilei" 来源: https://www.cnblogs.com/aisowe/p/11669875.html

计算机视觉(二)-opencv之createTrackbar()详解

限于喜欢 提交于 2019-12-01 07:22:14
摘要: 我学习openCV3看的是《学习openCV3》这本书,很厚的一本,不知道是不是因为自己看的还不是很多,个人觉得里面的有些重要函数讲的不是很详细,比如createTrackbar()这个函数,这个函数出现在这本书的第三个实例程序,书中只是说明了这是一个创建滚动条的程序,然而对里面的参数讲解以及与他相对应的回调函数讲解都不是很完美,因此我就打开了它的定义以及到网上找了一些博主的文章来学习,但是感觉讲的都不是很全,下面我结合自己的实验加上自己的理解,讲解一下我对这个函数的看法。 函数说明: createTrackbar()函数的函数原型为: CV_EXPORTS int createTrackbar(const String& trackbarname, const String& winname,int* value, int count,TrackbarCallback onChange = 0, void* userdata = 0); trackbarname:这个参数用来给这个滚动条取一个名字; winname:这个参数用来指定你要吧这个滚动条用到那个窗口上; value:这个参数用来设置滑块初始值位置,同时记录滑块以后的位置; count:这个参数用来指定滚动条可以滚动的最大值; onChange:这个参数可以理解为一个函数类型的变量(当然这样说感觉有点怪)

React中refs持久化

扶醉桌前 提交于 2019-12-01 07:22:10
根据使用React的版本,选择合适的方法。 字符串模式 :废弃不建议使用 回调函数,React版本 < 16.3 React.createRef() :React版本 >= 16.3 回调函数 特点 可以优雅在组件销毁时回收变量。每次组件重新渲染的时候,行内函数都会执行两次,第一次的ele的值为空,第二次才为真正的DOM对象,因为在每次渲染中React都会 创建一个新的函数实例 ; 很好的支持静态类型检测; 针对数组遍历时可以直接转换为对应的数组, CodePen示例 ; 可以将父组件的ref 传入 孙组件。 【持久化方法】 因为存在回收变量的特点,会导致有些时刻ref会变成null,要想在初始化的时候讲ref持久化下来,可以通过将 ref 的回调函数定义成类的静态函数的方式解决。 回调函数 CodePen示例 createRef React V16版本新增一个API:React.createRef(); 通过这个API,我们可以先创建一个ref变量,然后再将这个变量赋值给组件声明中ref属性就好了。 不同在于,需要通过 this.textInput.current,即真实的DOM是通过current属性来引用的。 CodePen示例 来源: https://www.cnblogs.com/dahe1989/p/11668246.html