回调函数
时间:2015-06-29 16:12:07
收藏:0
阅读:104
回调函数的定义为:传递一个函数A到另一个函数B中,由B调用A,我们就说函数A叫做回调函数。如果没有名称,就叫做匿名回调函数。
例1:Javascript中的回调函数
function invoke_and_add(a,b){ return a()+b(); } function one(){ return 1; } function two(){ return 2; } invoke_and_add(one ,two);
例2:Javascript中的匿名回调函数
invoke_and_add(function(){return 1;},function(){return 2;})
适用于:
1. 通过一个统一接口实现不同的内容
回调函数的使用在C++中相当于函数指针
int TVPrice(int price) { printf("The price of the TV is %d. \n", price); return 0; } int PCPrice(int price) { printf("The price of the PC is %d. \n", price); return 0; } void Caller(int n, int (*ptr)())//指向函数的指针作函数参数,第一个参数是为指向函数的指针服务的, { //不能写成void Caller(int (*ptr)(int n)) (*ptr)(n); } int main() { Caller(3000, TVPrice); Caller(5000, PCPrice); return 0; }
2. 异步调用
Javascript语言的执行环境是"单线程"(single thread)。所谓"单线程",就是指一次只能完成一件任务。如果有多个任务,就必须排队。实现异步的3种方法:
例1:回调函数。A先告诉B去点亮,然后自己点亮。B的点亮操作并不会阻塞A。
function lightUp(A, callback){ callback(); A.lightUp(); } function callback(){ B.lightUp(); }
***同步调用时这样的***
var temp = false; while(!temp){ temp = wait(A.lightUp()); } B.lightUp();
例2:事件监听。
function AlightUp(){ this.trigger(‘done‘); this.do(); } function BlightUp(){ this.do(); }
AlightUp.on(‘done‘,BlightUp);
例3:发布/订阅。
jQuery.subscribe("done", f2); function f1(){ setTimeout(function () { // f1的任务代码 jQuery.publish("done"); }, 1000); }
f2完成执行后,也可以取消订阅(unsubscribe)。
jQuery.unsubscribe("done", f2);
这种方法的性质与"事件监听"类似,但是明显优于后者。因为我们可以通过查看"消息中心",了解存在多少信号、每个信号有多少订阅者,从而监控程序的运行。
例4:Promises
Promises对象是CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口。
简单说,它的思想是,每一个异步任务返回一个Promise对象,该对象有一个then方法,允许指定回调函数。比如,f1的回调函数f2,可以写成:
f1().then(f2); function f1(){ var dfd = $.Deferred(); setTimeout(function () { // f1的任务代码 dfd.resolve(); }, 500); return dfd.promise; }
这样写的优点在于,回调函数变成了链式写法,程序的流程可以看得很清楚。
比如,指定多个回调函数:f1().then(f2).then(f3);
再比如,指定发生错误时的回调函数:f1().then(f2).fail(f3);
评论(0)