1.Callback

1.1 基本概念

函数:能存储在变量中,能作为实参传递,能在函数中被创建,能从函数中返回
回调函数:就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

异步回调:

1
2
3
4
5
6
7
8
//事件句柄
$(document).on('click',callback)
//Ajax
$.ajax().done(callback).fail(callback);
//资源加载
//定时器延时
//动画通知
//以上归根结底都是事件监听回调的方式

同步回调:

1
2
3
4
5
6
//嵌套
var test1 = function(callback) {
callback();
}
test1(function() {
});

1.2理解观察模式

观察者模式:当事件发生时,被观察者(Publisher)就会通知观察者/订阅者(subscriber)。

简单实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//定义模式---重点
var Observable = {
callbacks: [],
add: function(fn){
this.callbacks.push(fn);
},
fire: funciton(){
this.callbacks.forEach(function(fn){ //遍历数组内函数,进行统一发布
fn();
})
}
}
//开始订阅
Observable.add(function() {
alert(1)
})
Observable.add(function() {
alert(2)
})
//开始发布
Observable.fire(); // 1, 2

2.Deferred–异步回调–可实现异步管道风格

2.1理解异步

我们一直习惯于线性地编写代码逻辑,但是大量异步操作所带来的回调函数,会把我们的算法分解地支离破碎
常见异步操作:
定时器setTimeout
postmessage(SSE)
WebWorkor
CSS3 动画(jquery的animate是异步)
XMLHttpRequest(Ajax)
HTML5的本地数据

2.2 Deferred

deferred拥有promise的所有属性和方法,唯一的区别就是deferred可以通过resolve和reject来手动改变状态。
done()fail()progress()分别注册(互相关联)resolvedrejectedpending状态下的回调函数。
通过resolve()reject()notify()可以触发事先注册的回调函数。

只是改变了一下调用方式而已!!

2.3 合并多个异步操作(when)实质:观察者模式(订阅发布模式)

方法:
1.监听每一个异步的状态(成功,失败),如果是完成了自然会激活done方法!
2.updateFunc是监听方法,通过判断异步对象执行的次数来决定是不是已经完成了所有的处理
3.因为when也要形成异步操作,所以内部必须新建一个jQuery.Deferred()对象,用来给后面链式调用。
4.此刻监听所有异步对象(d1,d2…)的updateFunc的处理都完毕了,会给一个正确的通知给when后面的done方法,因为done是通过第三步jQuery.Deferred()创建的,所以此时就需要发送消息到这个上面,即:
总结:通过判断when的参数个数和发送过来的数据的个数做比较,相等的时候执行

Deferred详解

3. Promise

← Prev Next →