前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ajax 的回调

Ajax 的回调

作者头像
用户7293182
发布2022-01-17 21:14:29
4.4K0
发布2022-01-17 21:14:29
举报
文章被收录于专栏:jQuery每日经典
代码语言:javascript
复制
 1   document.getElementById("test").onclick=function(){ 
 2     console.log(1); 
 3   } 
 4   document.getElementById("test").onclick=function(){ 
 5     console.log(2); 
 6   } 
 7   document.getElementById("test1").addEventListener("click", function(){ 
 8     console.log(3); 
 9   });
10   document.getElementById("test1").addEventListener("click", function(){
11     console.log(4);
12   });

页面上有两个button,以上js代码为button添加click事件。会输出什么样的结果呢?

如果不想覆盖第一个添加的click事件,需要使用第二种方法。那怎么给ajax添加多个回调事件呢?

jQuery 中 Ajax 的发展

1. 原始版本

在JQuery 1.5之前,Ajax仅支持一个回调函数,

代码语言:javascript
复制
1     $.ajax({
2       url: "/ServerResource.txt",
3       success: successFunction,
4       error: errorFunction
5     });

$.ajax()操作完成后,返回的是XHR对象,你没法进行链式操作;

2. 链式操作,多次调用

但在JQuery的1.5版本中,引入了 Deferred 对象,它返回的是deferred对象,允许注册多个回调函数,并且能传递任何同步或异步函数的执行状态–成功或失败。

代码语言:javascript
复制
1 $.ajax( "example.php" )
2 .done(function() { alert("success"); })
3 .fail(function() { alert("error"); })
4 .always(function() { alert("complete"); });

always() 相当于 complete()done() 相当于success(), fail() 相当于error()。在 done()fail() 执行完毕之后才执行,即无论Ajax的执行结果是什么, always() 总会执行。

也可以添加多个相同的回调函数:

代码语言:javascript
复制
1 $.ajax("test.html")
2 .done(function(){ alert("第一个done回调函数");} )
3 .fail(function(){ alert("出错啦!"); } )
4 .done(function(){ alert("第二个done回调函数!");} );

简单说, Deferred 对象就是jQuery的回调函数解决方案,它解决了如何处理耗时操作的问题,对那些操作提供了更好的控制,以及统一的编程接口。

3. then方法的使用

另外一种产生链式调用的方式是利用Promise的 then 方法,它接受三个event handlers作为参数,对于多个回调函数,有需要以数组方式传入三个参数

代码语言:javascript
复制
$.ajax({url: "/ServerResource.txt"})
.then(successFunction,errorFunction,alwaysFunction);
代码语言:javascript
复制
$.ajax({url: "/ServerResource.txt"})
.then([successFunction1, successFunction2, successFunction3],
[errorFunction1, errorFunction2]);

也可以多次调用then方法:

代码语言:javascript
复制
1 var promise = $.ajax("/myServerScript1");
2 function getStuff() {
3   return $.ajax("/myServerScript2");
4 }
5 promise.then(getStuff).then(function(myServerScript2Data){
6   // Do something
7 });

4. when方法为多个操作指定回调函数

Deferred对象允许你为多个事件指定一个回调函数,这是传统写法做不到的。请看下面的代码,它用到了一个新的方法 $.when()

代码语言:javascript
复制
$.when($.ajax("test1.html"), $.ajax("test2.html"))
.done(function(){ alert("哈哈,成功了!"); })
.fail(function(){ alert("出错啦!"); });

这段代码的意思是,先执行两个操作$.ajax("test1.html")$.ajax("test2.html"),如果都成功了,就运行done()指定的回调函数;如果有一个失败或都失败了,就执行fail()指定的回调函数。

Complete开头题的答案是:

点击test按钮 -- 输出2

点击test1按钮 -- 输出3,4

这个发展历程得益于程序猿们不断对promise的完善,关于promise的教程可以查看官网文档。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-09-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 jQuery每日经典 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档