同步,异步

2019-08-07  本文已影响0人  haha2333

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

以上几种方法的比较:

上一篇下一篇

猜你喜欢

热点阅读