码迷,mamicode.com
首页 > 其他好文 > 详细

回调函数

时间:2015-06-29 16:12:07      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:

回调函数的定义为:传递一个函数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);

回调函数

标签:

原文地址:http://www.cnblogs.com/qionglouyuyu/p/4607439.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!