之前分析过js的运行机制,这里再介绍一下异步编程。
天生的异步操作,DOM的点击事件,AJAX获取数据,计时器等。两个函数,fn1,fn2,fn2要依靠fn1的结果运行,但是fn1耗时长,这时就要手动实现异步编程。
1.回调函数
使用setTimeout把fn1的执行变成异步操作,等fn1运行完,再执行fn2.
function fn1(callback){
//fn1的执行语句
setTimeout(function(){
callback()
},1000)
}
fn1(fn2)
这种方法的优点是易于理解,但是耦合性太高。
2.es6提供的Promise对象
每个异步任务返回一个Promise对象。
function fn1(){
var def = $.Deferred();
setTimeout(function(){
//fn1的执行语句
ded.resolve();
},1000)
return def.promise
}
fn1.then(fn2)
3.订阅-发布模式(观察者模式)
假设存在一个信息中心,一个任务完成后向信息中心发布一个信号,而其他任务可以从信息中心订阅这个信号,从而知道自己什么时候执行。
jQuery.subscribe('done', fn2)
function fn1(){
setTimeout(function(){
//fn1的执行代码
jQuery.publish('done')
},1000)
}
fn1运行结束后,向信息中心发布信号,而fn2由于先前订阅了这个信号,所以此时开始执行。
4.时间监听
事件被触发后,任务开始执行。
fn1.on('done', fn2)
function fn1(){
setTimeout(function(){
//fn1的执行代码
fn1.trigger('done')
},1000)
}
网友评论