一,回调函数
举例:异步回调函数:在接受到ajax请求返回的数据才执行的函数
f2是f1的回调函数 A是B的回调函数 A在B后面执行
function f1(){
setTimeout(function () {
// f1的任务代码
f2();
}, 1000);
}
f3();
运行顺序 f1,f3,f2(数秒和f3同时进行,因为浏览器是多线程的) 1s之后直接执行f2
js是单线程的
settimeout将f2放在消息队列里,当主线程执行完毕,执行f2
f1() => {
if (valid) {
var param = this.form;
param['callback'] = function(res){
f2() //这部分等待 f3之行结束之后才运行 不是浏览器主线程的内容
}
f3()//ajax请求数据 这部分是主线程的内容
f2是f1的回调函数
二 事件监听
function f1(){
setTimeout(function () {
// f1的任务代码
f1.trigger('click');
}, 1000);
}
1s之后为激活f1的click事件
f1.on('click', f2);
f1的点击事件被激活之后,执行f2
三 发布/订阅
jQuery.subscribe("done", f2); //f2订阅done信号
function f1(){
setTimeout(function () {
//f1的任务
jQuery.publish("done");
}, 1000);
}
f1任务代码结束后,发布done信号,f2此时接受到信号,开始运行
四 promise
每一个异步任务返回一个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);
而且,它还有一个前面三种方法都没有的好处:如果一个任务已经完成,再添加回调函数,该回调函数会立即执行。所以,你不用担心是否错过了某个事件或信号。这种方法的缺点就是编写和理解,都相对比较难。