js异步操作的方法:
1.回调函数
就是把一方法当作参数传到另一个方法里。有两种回调方式:同步回调和有异步回调
- 同步回调
function f2(data){
console.log(data)
}
function f1(callfun){
var a =""
callfun(a)
console.log("执行完毕")
}
f1(f2)
执行顺序:执行f1->f2->f1的console
依然是顺序执行,等待f2执行完毕再继续。同步回调的实质就是代码分离
- 异步回调
function f2(data){
console.log(data)
}
function f1(callfun){
var a =""
setTimeout(callfun(a),500)
console.log("执行完毕")
}
f1(f2)
执行顺序:执行f1->设定f2执行的定时器->f1的console->f2
通过定时器实现了函数的异步回调
优点:看起来简单易懂
缺点:不利于代码的阅读和维护,各个部分之间高度耦合。流程会很混乱,而且每个任务只能指定一个回调函数。容易陷入回调地狱。(多次回调信任问题)
为了使多个函数可以顺序执行,使用多层次的异步回调过程中,
doA(function(){
doB();
doC(function(){
doD()
})
doE()
})
doF() //注:BCDE都是异步操作
以上代码的执行序:A->F->B->C->E->F->D
补充:setTimeout作用,他是一个定时器,当定时器时间到了之后,环境会把回调函数挂到事件循环中,然后就等待前面的函数执行完毕,再执行他。所以定时期只能保证事件肯定在设定时间之后执行,不能保证具体执行时间。
2.事件监听
比如click事件,触发操作。
3.发布订阅模式
我们假定,存在一个"信号中心",某个任务执行完成,就向信号中心"发布"(publish)一个信号,其他任务可以向信号中心"订阅"(subscribe)这个信号,从而知道什么时候自己可以开始执行。这就叫做"发布/订阅模式"(publish-subscribe pattern),又称"观察者模式"(observer pattern)。我们可以通过查看"消息中心",了解存在多少信号、每个信号有多少订阅者,从而监控程序的运行。
jQuery.subscribe("done", f2); //首先,f2向"信号中心"jQuery订阅"done"信号。
function f1(){
setTimeout(function () {
// f1的任务代码
jQuery.publish("done"); //f1执行完成后,向"信号中心"jQuery发布"done"信号,引发f2的执行。
}, 1000);
}
jQuery.unsubscribe("done", f2); //f2完成执行后,也可以取消订阅(unsubscribe)。
4.promise https://www.jianshu.com/p/0edaf787fd0b
5.异步迭代生成器 https://www.jianshu.com/p/c99fab058b77
6.asyc,await
以上几种方法的比较:
网友评论