回调函数

C 语言回调函数详解

倾然丶 夕夏残阳落幕 提交于 2020-01-17 04:58:13
什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义。我在百度上搜了一下,发现众说纷纭,有很大一部分都是使用类似这么一个场景来说明:A君去B君店里买东西,恰好缺货,A君留下号码给B君,有货时通知A君。感觉这个让人更容易想到的是异步操作,而不是回调。另外还有两句英文让我印象深刻:1) If you call me, I will call you back; 2) Don’t call me, I will call you. 看起来好像很有道理,但是仔细一想,普通函数不也可以做到这两点吗?所以,我觉得这样的说法都不是很妥当,因为我觉得这些说法都没有把回调函数的特点表达出来,也就是都看不到和普通函数到底有什么差别。不过,百度百科的解析我觉得还算不错(虽然经常吐槽百度搜索…):回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。 下面先说说我的看法。我们可以先在字面上先做个分解,对于"回调函数",中文其实可以理解为这么两种意思:1) 被回调的函数;2) 回头执行调用动作的函数。那这个回头调用又是什么鬼? 先来看看来自维基百科的对回调(Callback)的解析:In computer programming

Tampermonkey 文档

落爺英雄遲暮 提交于 2020-01-16 19:37:07
@doc https://www.tampermonkey.net/documentation.php 目录 @name @name 脚本的名字 @namespace @namespace 脚本的命名空间 @version 脚本的版本,用于检查更新。 @author 脚本的作者 @description 简短重要的描述 @homepage, @homepageURL, @website and @source 在“选项”页上用于从脚本名链接到给定页的作者主页。请注意,如果@namespace标记以“http://”开头,则其内容也将用于此操作。 @icon, @iconURL and @defaulticon 低分率的脚本会在脚本管理列表上显示 @icon64 and @icon64URL 脚本icon 64*64 如果给了这个标签,但给了图标,则图标图像将在选项页的某些位置缩放 @updateURL 更新脚本的地址,注意:只有存在@version标签才会去更新 @downloadURL 定义检测到更新时将从中下载脚本的URL。如果值为none,则不会执行更新检查。 @supportURL 定义使用者报告issues和个人支持的地址 @include 脚本应该运行的页面, 可以使用正则匹配。 允许多个标签 请注意@include不支持url hash参数

【一起学源码-微服务】Hystrix 源码二:Hystrix核心流程:Hystix非降级逻辑流程梳理

久未见 提交于 2020-01-16 08:53:48
说明 原创不易,如若转载 请标明来源! 欢迎关注本人微信公众号: 壹枝花算不算浪漫 更多内容也可查看本人博客: 一枝花算不算浪漫 前言 前情回顾 上一讲我们讲了配置了feign.hystrix.enabled=true之后,默认的Targeter就会构建成 HystrixTargter , 然后通过对应的 HystrixInvocationHandler 生成对应的动态代理。 本讲目录 这一讲开始讲解Hystrix相关代码,当然还是基于上一个组件Feign的基础上开始讲解的,这里默认你已经对Feign有过大致了解。 目录如下: 线程池初始化过程 HystrixCommand通过线程池执行原理 由于这里面代码比较多,所以我都是将一些主要核心代码发出来,这里后面会汇总一个流程图,可以参考流程图 自己一点点调试。 这里建议在回调的地方都加上断点,而且修改feign和hystrix超时时间,浏览器发送请求后,一步步debug代码。 源码分析 线程池初始化过程 上一讲已经讲过激活Hystrix后,构造的InvocationHandler为 HystrixInvocationHandler ,所以当调用FeignClient服务实例的时候,会先执行 HystrixInvocationHandler.invoke() 方法,这里我们先跟进这个方法: final class

Android OpenSL ES 开发:Android OpenSL 介绍和开发流程说明

岁酱吖の 提交于 2020-01-16 07:24:32
一、Android OpenSL ES 介绍 OpenSL ES (Open Sound Library for Embedded Systems)是无授权费、跨平台、针对嵌入式系统精心优化的硬件音频加速API。它为嵌入式移动多媒体设备上的本地应用程序开发者提供标准化, 高性能,低响应时间的音频功能实现方法,并实现软/硬件音频性能的直接跨平台部署,降低执行难度,促进高级音频市场的发展。简单来说OpenSL ES是一个嵌入式跨平台免费的音频处理库。 Android的OpenSL ES库是在NDK的platforms文件夹对应android平台先相应cpu类型里面,如: 二、Android OpenSL ES 开发流程 OpenSL ES 的开发流程主要有如下6个步骤: 1、 创建接口对象 2、设置混音器 3、创建播放器(录音器) 4、设置缓冲队列和回调函数 5、设置播放状态 6、启动回调函数 注明:其中第4步和第6步是OpenSL ES 播放PCM等数据格式的音频是需要用到的。 在使用OpenSL ES的API之前,需要引入OpenSL ES的头文件,代码如下: #include <SLES/OpenSLES.h> #include <SLES/OpenSLES_Android.h> 由于是在Native层使用该特性,所需需要在Android.mk中增加链接选项

53树莓派操作引脚口

ε祈祈猫儿з 提交于 2020-01-15 22:35:47
https://www.jianshu.com/p/f31b90cc756f 1倒入引用  importRPi.GPIOasGPIO   2针脚编号 不同的命名规则 你可以使用下列代码(强制的)指定一种编号规则:   GPIO.setmode(GPIO.BOARD)   #or   GPIO.setmode(GPIO.BCM)   下面代码将返回被设置的编号规则   mode=GPIO.getmode()    3警告   如果RPi.GRIO检测到一个引脚已经被设置成了非默认值,那么你将看到一个警告信息。你可以通过下列代码禁用警告: GPIO.setwarnings(False) 引脚设置 在使用一个引脚前,你需要设置这些引脚作为输入还是输出。配置一个引脚的代码如下: #将引脚设置为输入模式 GPIO.setup(channel,GPIO.IN) #将引脚设置为输出模式 GPIO.setup(channel,GPIO.OUT) #为输出的引脚设置默认值 GPIO.setup(channel,GPIO.OUT,initial=GPIO.HIGH) 4释放 一般来说,程序到达最后都需要释放资源,这个好习惯可以避免偶然损坏树莓派。释放脚本中的使用的引脚: GPIO.cleanup() 注意,GPIO.cleanup()只会释放掉脚本中使用的GPIO引脚,并会清除设置的引脚编号规则。

PHP 回调函数

余生颓废 提交于 2020-01-15 19:29:00
回调函数顾名思义, 就是函数内部使用另外一个函数。使用回调函数也很简单, 我们可以通过2个方法实现: 一:使用变量函数 function test ( $a ) { return $a ( ) ; } function demo ( ) { return 'A' ; } echo test ( 'demo' ) ; //输出demo函数返回的值即: A 二:使用函数call_user_func_array() 该函数是php的内置函数, 需要传入2个参数, 第一个是要调用的函数名, 第二个是参数列表(数组形式), 函数会将第二个参数中的参数按顺序依次传入调用的函数的参数中。 function test ( $a ) { return call_user_func_array ( $a , array ( ) ) ; } function demo ( ) { return 'A' ; } echo test ( 'demo' ) ; //输出demo函数返回的值即: A 上诉2种方法都是在全局函数中使用回调函数, 那么如果是类中的方法该如何进行回调呢? 也很简单我们依旧借助call_user_func_array()函数 call_user_func_array ( array ( 对象引用 , "类中的方法名称字符串" ) , 传递给此方法的参数 ( 数组形式 ) ) //

python 跨域处理方式

我怕爱的太早我们不能终老 提交于 2020-01-15 16:17:47
因为浏览器的同源策略限制,不是同源的脚本不能操作其他源下面的资源,想操作另一个源下面的资源就属于跨域了,这里说的跨域是广义跨域,我们常说的代码中请求跨域,是狭义的跨域,即在脚本代码中向非同源域发送http请求 浏览器的同源策略(SOP/same origin policy)是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS(跨站脚本攻击 cross site scripting)和CSRF(跨站请求伪造cross-site request forgery)等攻击。 (同源 origin:协议,域名,端口号,不清楚的话,直接在浏览器控制台中输入window.location.origin看看返回值就知道了。) 下面两种情况,是不受跨域限制的,严格来讲,这两种情况只是跨站资源请求: 1)页面中的链接,重定向及表单提交是不受同源策略限制的 2)跨域资源的引入,如 < script src="" > < image src="" > < iframe > 等 从上面的第二种情况,我们可以发现,但凡通过src去获取非同源状态的资源时,都是不受跨域限制的,那我们就可以想想,是否可以借助这种跨站资源请求的方式来实现http跨域请求呢?这就是我们接下来要说的第一种跨域解决方案:jsonp 1、JSONP(不仅限于python,所有的GET请求都可以使用jsonp实现跨域)

promise源码完善

倾然丶 夕夏残阳落幕 提交于 2020-01-15 15:23:57
关于调用then,传入回调函数为null 或者数值的问题 原生Promise回调函数传入null: //let Promise=require("./Promise"); let p1 = new Promise ( ( resolve , reject ) = > { resolve ( 'ok' ) ; } ) ; let p2 = 来源: CSDN 作者: gloria123_ 链接: https://blog.csdn.net/gloria123_/article/details/103983197

【ECMAScript6】Promise对象

倖福魔咒の 提交于 2020-01-14 16:03:52
Promise ,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。 有了 Promise 对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外, Promise 对象提供统一的接口,使得控制异步操作更加容易。 一、基本用法 ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。 const promise = new Promise(function(resolve, reject) { // ... some code if (/* 异步操作成功 */){ resolve(value); } else { reject(error); } }); Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。 resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去; reject函数的作用是,将Promise对象的状态从“未完成

深入理解JS函数中this指针的指向

爱⌒轻易说出口 提交于 2020-01-14 08:52:40
函数在执行时,会在函数体内部自动生成一个this指针。谁 直接调用 产生这个this指针的函数 ,this就指向谁。 怎么理解指向呢,我认为指向就是等于。例如直接在js中输入下面的等式: console.log(this===window);//true 情况不同,this指向的对象也不同。例如: 1. 函数声明的情况 var bj=10; function add(){ var bj=20; console.log(this);//window console.log(this.bj);//10 console.log(bj);//20 console.log(this.bj+bj);//30 } add(); window.add(); (1) 执行了add()之后,此时的this指向的是window对象,为什么呢?因为这时候add是全局函数,是通过window 直接调用 的。所以下面我专门写了个window.add()就是为了说明,全局函数的this都是指向的window。 (2) 就像alert()自带的警告弹窗一样,window.alert()执行之后也是一样的效果。所以只要是 window点 这种调用方式都可以省略掉,因此警告弹窗可以直接使用alert()。 2. 函数表达式 var bj=10; var zjj=function(){ var bj=30;