js异步

一,回调函数

举例:异步回调函数:在接受到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);

而且,它还有一个前面三种方法都没有的好处:如果一个任务已经完成,再添加回调函数,该回调函数会立即执行。所以,你不用担心是否错过了某个事件或信号。这种方法的缺点就是编写和理解,都相对比较难。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值