回调函数

ES6 Promise使用介绍

丶灬走出姿态 提交于 2020-01-20 12:50:39
1、什么是Promise Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。 这么说可能不够直观的理解,看下面的两个例子     // callback回调函数 function getCallback(n,callback) { setTimeout(() => { var num = 2*n console.log('num',num) callback(num) },2000) } getCallback(3,function callback(n) { console.log('n',n) }) // Promise函数的基础用法(等同于上面的回调函数) function runPro(n){ let p = new Promise((resolve,reject) => { setTimeout(() => { var num = 2*n console.log('num',num) resolve(num) },2000) }) return p } runPro(3).then((res) => { console.log('res',res) }) 这么看是不是觉得Promise并没有什么特别的,而且还要费劲封装,有这功夫用回调函数就好了,那么在看下面的例子     // 三层callback回调函数(传说的回调地狱)

回调函数

为君一笑 提交于 2020-01-20 00:25:42
一、概念 回调函数就是一个通过函数指针调用的函数。 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。 回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。 二、机制 ⑴、定义一个回调函数; ⑵、提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者; ⑶、当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。 三、意义 因为可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的函数的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。 四、调用约定 回调函数原型中可以找到__stdcall ,因为它以双下划线打头,所以它是一个特定于编译器的扩展,说到底也就是微软的实现。 任何支持开发基于Win32的程序都必须支持这个扩展或其等价物 。以__stdcall标识的函数使用了标准调用约定,为什么叫标准约定呢,因为所有的Win32 API(除了个别接受可变参数的除外)都使用它。 标准调用约定的函数在它们返回到调用者之前,都会从堆栈中移除掉参数,这也是Pascal的标准约定。 但在C/C++中

JS高阶函数的使用

三世轮回 提交于 2020-01-19 16:07:47
高阶函数是对其他函数进行操作的函数,可以将它们作为参数或通过返回它们。 简单来说,高阶函数是一个函数,它接收函数作为参数或将函数作为输出返回。 简单一张图,方便理解全文。 常见的高 阶 函数: 1、 filter 过滤函数 filter 也是一个常用的操作,它用于把 Array 的某些元素过滤掉,然后返回剩下的元素。 filter 把传入的函数依次作用于每个元素,然后 根据返回值是 true 还是 false 决定保留还是丢弃该元素。 const nums = [2,3,5,1,77,55,100,200]; let newArray = nums.filter(function (n) { //小于100就是true,进入newArray数组 return n < 100; }) console.log(newArray);//[2,3,5,1,77,55] 2、map高阶函数 map函数同样会遍历数组每一项,传入回调函数为参数,num是map遍历的每一项,回调函数function返回值会被添加到 新数组中 const nums = [2,3,5,1,77,55,100,200]; let new2Array = nums.map(function (num) { return n*2;//每过元素都乘2 }) console.log(new2Array);//[4,6,10,2

浏览器和Node 事件循环的区别

≡放荡痞女 提交于 2020-01-19 11:59:57
题目描述: 浏览器和Node 事件循环的区别 解题: 思路一: 其中一个主要的区别在于浏览器的event loop 和nodejs的event loop 在处理异步事件的顺序是不同的,nodejs中有micro event;其中Promise属于micro event 该异步事件的处理顺序就和浏览器不同.nodejs V11.0以上 这两者之间的顺序就相同了 function test () { console.log('start') setTimeout(() => { console.log('children2') Promise.resolve().then(() => {console.log('children2-1')}) }, 0) setTimeout(() => { console.log('children3') Promise.resolve().then(() => {console.log('children3-1')}) }, 0) Promise.resolve().then(() => {console.log('children1')}) console.log('end') } test() // 以上代码在node11以下版本的执行结果(先执行所有的宏任务,再执行微任务) // start // end // children1 //

ajax jsonp跨域

浪子不回头ぞ 提交于 2020-01-19 06:04:49
$.ajax({ type : "get", async:false, url : "ajax.ashx", dataType : "jsonp", jsonp: "callbackparam",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback) data:"name=jxq&email=feichexia@yahoo.com.cn&callbackparam=?", // callbackparam与上面的jsonp值一致 jsonpCallback:"success_jsonpCallback",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名 success : function(json){ alert(json); alert(json[0].name); }, error:function(){ alert('fail'); } }); dataType: "jsonp", jsonp: "callbackparam", // 指定回调函数,这里名字可以为其他任意你喜欢的,比如callback,不过必须与下一行的GET参数一致 data: "name=jxq&email=feichexia@yahoo.com.cn&callbackparam=?", //

javascript 理解和使用回调函数

故事扮演 提交于 2020-01-18 15:07:58
在javascript中 ,function是内置的类对象,也就是说它是一种类型的对象,可以和其他String、Array、Number、Objec类的对象一样用于内置对象的管理。因为function实际上是一种对象,它可以“存储在变量中,通过参数传递给(另一个)函数(function),在函数内部创建,从函数中返回结果值”。 因为函数名本身是变量,所以函数也可以作为值来使用。 也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回。 function callSomeFunction(someFunction, somaArgument) { return someFunction(somaArgument); } function add(num) { return num + 10; } var result1 = callSomeFunction(add, 10); console.log(result1); // 20; function getGreeting(name) { return "hello "+ name; } var result2 = callSomeFunction(getGreeting, "world"); console.log(result2); // hello world;

深入delphi编程理解之消息(一)WINDOWS原生窗口编写及消息处理过程

ⅰ亾dé卋堺 提交于 2020-01-17 19:45:16
  通过以sdk方式编制windows窗口程序,对理解windows消息驱动机制和delphi消息编程有很大的帮助。 sdk编制windows窗口程序的步骤: 1、对TWndClass对象进行赋值; 2、向系统注册wndclass对象(RegisterClass); 3、CreateWindow创建窗口,获得窗口句柄Hwnd; 4、显示窗口(ShowWindow); 5、通过GetMessage函数不断获取系统消息,交给程序处理,程序过通回调函数(wndproc)处理系统消息。(消息处理部分)程序代码如下: program Project2; //{$APPTYPE CONSOLE} uses Windows, Messages; //============================================================================== // 定义回调函数 Wndproc(),处理windows消息; // 参数说明: // HWND 可以理解为窗口句柄 // AMessage 可理解为消息的编号 // Wparam 消息的高位 // Lparam 消息的低位 //==============================================================================

GTK入门

早过忘川 提交于 2020-01-17 19:18:17
环境准备 官网 下载 GTK 源码包,因为本机 GLib 版本不够,下载一个非最新版的 GTK3.8.0 先学习用 直接阅读 "/gtk+-3.8.0/docs/reference/gtk/html/gtk-building.html" 进行操作 安装完毕, gtk3-demo 出来 gtk 的样例界面即安装搞定 实例学习 编译命令和编译脚本 编译参数包括 pkg-config --libs --cflags gtk+-3.0 为了方便,用脚本管理起来 build.sh #!/bin/bash if [ $# -lt 1 ]; then echo "usage: $0 [xxxx.c]" exit fi gcc -o $1_out $1 `pkg-config --libs --cflags gtk+-3.0` 一个简单的HelloWorld按钮 01_simple_button.c #include <gtk/gtk.h> // 回调函数1 void hello( GtkWidget *widget, GdkEvent *event, gpointer data ) { g_print("Hello World\n"); } // 回调函数2 void destroy( GtkWidget *widget, gpointer data ) { gtk_main_quit(); }

libev 源码解析

Deadly 提交于 2020-01-17 06:03:03
一 libev简介   libev是一个轻量级的事件通知库,具备支持多种事件通知能力,通过对libev的源码的阅读,可以清楚了解事件通知实现内部机制。 二 核心数据结构 在libev中关键的数据结构是,loop结构体,该结构体定义的字段较多,但是主要核心的可以分为两大类 ev_loop结构体(loop为ev_loop结构的全局变量)的字段定义在ev_vars.h头文件中,然后在ev.c中通过include的方式导入 1.各类事件的watcher集合  loop中有支持很多类型的事件,如下 ev_io // IO可读可写 ev_stat // 文件属性变化 ev_signal // 信号处理 ev_timer // 相对定时器 ev_periodic // 绝对定时器 ev_child // 子进程状态变化 ev_fork // fork事件 ev_cleanup // event loop退出触发事件 ev_idle // event loop空闲触发事件 ev_embed // 嵌入另一个后台循环 ev_prepare // event loop之前事件 ev_check // event loop之后事件 ev_async // 线程间异步事件 这些事件的监控管理都对应一种类型的watcher数组,比如 (loop)->anfds :维护所有fd事件 (loop)-

tcp异步机制

馋奶兔 提交于 2020-01-17 05:21:37
前面关于socket的编程,全部是基于同步机制开发的服务器和客户端,线程会进入阻塞或者挂起状态,降低线程利用率,同时程序影响效率。因此,向tcp程序引入异步回调:在异步套接字完成网络操作后,线程没有被阻塞或者挂起,接着通过调用回调函数处理后续网络操作。而主线程继续执行,以实现并行执行的结果。 为什么要引入异步机制? 看到过一个解释。当我们打开一个程序时,鼠标不停地转但是就是不见界面跳转,这是其他耗时操作阻碍了ui线程,造成ui线程不能响应用户操作。如果引用异步机制,ui线程在发起耗时操作之后马上回来响应用户操作,把能响应的都给用户,最后等耗时操作结束,通过回调来处理耗时操作的结果。这就是异步机制能快速响应用户界面,还有更高的伸缩性(线程池更加灵活分配利用数量有限的线程) 什么是回调函数?为什么要用回调函数? 简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调常常是异步调用的基础,即回调用于通知机制。具体看 http://www.cnblogs.com/swordzj/archive/2007/04/24/2034769.html 。委托就是C++的函数指针,即回调机制;就是Java的监听器:所有提供功能待植入的机制都要用到它。 异步回调代码例子如下: sever