多ajax请求的各类解决方案(同步, 队列, cancel请求)

前端之家收集整理的这篇文章主要介绍了多ajax请求的各类解决方案(同步, 队列, cancel请求)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

ajax带来很好的用户体验,于是一个稍微注重web系统使用ajax基本成为必然。当传统功能型web项目向用户体验型项目转变时,层出不穷的需求就来了。正如本篇所介绍的就是一个多个AJAX请求的情况下,如何利用jquery来处理几种case


  1. 多个ajax请求同时发送,相互无依赖。
  2. 多个ajax请求相互依赖,必须有先后顺序。
  3. 多个请求被同时发送,只需要最后一个请求。

第1种case

应用场景: 这个场景很多,一个页面打开是多个区域同时请求后台得到各自的数据,没依赖,没顺序。
处理方案: 直接用jquery的ajax函数。这个用的非常多,这里从略,可看后面的代码中例子。

第2种case

应用场景: 多个ajax请求,需要顺序执行,后一个ajax请求的执行参数是前一个ajax的结果。例如: 用户登录后我们发送一次请求得到用户的应用ID,然后利用应用ID发送一次请求得到具体的应用内容(例子虽然不是太恰当,但基本就是这个意思了)。
处理方法
1. 利用ajax参数async设置为false,进行同步操作。(这个方法只适合同域操作,跨域需使用下面两种方法)
2. 利用ajax嵌套(这个同第1种情况)
3. 利用队列进行操作

jquery ajax队列操作核心代码:

  1. (function ($) { var ajaxRequest = {}; $.ajaxQueue = function (settings) { var options = $.extend({ className: 'DEFEARTNAME' },$.ajaxSettings,settings); var _complete = options.complete; $.extend(options,{ complete: function () { if (_complete) _complete.apply(this,arguments); if ($(document).queue(options.className).length > 0) { $(document).dequeue(options.className); } else { ajaxRequest[options.className] = false; } } }); $(document).queue(options.className,function () { $.ajax(options); }); if ($(document).queue(options.className).length == 1 && !ajaxRequest[options.className]) { ajaxRequest[options.className] = true; $(document).dequeue(options.className); } }; })(jQuery);

第3中case

应用场景: 比较典型的是autocomplete控件的操作,这个我们可以使用第2种情况的处理方法,但我们可能只需要最后次按键后返回的结果,这样利用第2种处理方法未免有些浪费。
处理方法: 保留最后一次请求,cancel之前的请求。

  1. (function ($) { var jqXhr = {} $.ajaxSingle = function (settings) { var options = $.extend({ className: 'DEFEARTNAME' },settings); if (jqXhr[options.className]) { jqXhr[options.className].abort(); } jqXhr[options.className] = $.ajax(options); }; })(jQuery);

对于这些case都是在多个ajax请求,响应时间不能控制的情况。下面是完整Demo代码

  1. (function ($) {
  2. var jqXhr = {},ajaxRequest = {};
  3. $.ajaxQueue = function (settings) {
  4. var options = $.extend({ className: 'DEFEARTNAME' },settings);
  5. var _complete = options.complete;
  6. $.extend(options,{
  7. complete: function () {
  8. if (_complete)
  9. _complete.apply(this,arguments);
  10. if ($(document).queue(options.className).length > 0) {
  11. $(document).dequeue(options.className);
  12. } else {
  13. ajaxRequest[options.className] = false;
  14. }
  15. }
  16. });
  17. $(document).queue(options.className,function () {
  18. $.ajax(options);
  19. });
  20. if ($(document).queue(options.className).length == 1 && !ajaxRequest[options.className]) {
  21. ajaxRequest[options.className] = true;
  22. $(document).dequeue(options.className);
  23. }
  24. };
  25. $.ajaxSingle = function (settings) {
  26. var options = $.extend({ className: 'DEFEARTNAME' },settings);
  27. if (jqXhr[options.className]) {
  28. jqXhr[options.className].abort();
  29. }
  30. jqXhr[options.className] = $.ajax(options);
  31. };
  32. })(jQuery);
  33. var ajaxSleep = (function () {
  34. var _settings = {
  35. type: 'GET',cache: false,success: function (msg) {
  36. var thtml = $('#txtContainer').html();
  37. $('#txtContainer').html(thtml + "<br />" + msg);
  38. }
  39. };
  40. return {
  41. get: function (seconds,mode,isAsync) {
  42. var mode = mode || 'ajax',isAsync = isAsync || false;
  43. $[mode]($.extend(_settings,{
  44. url: "ResponsePage.aspx?second=" + seconds,async: isAsync,className: 'GET'
  45. }));
  46. },post: function (seconds,{
  47. type: 'POST',url: "PostPage.aspx",data: { second: seconds },className: 'POST'
  48. }));
  49. }
  50. };
  51. } ());
  52. var launch = function (settings) {
  53. $('#txtContainer').html('');
  54. var mode = settings.mode,isAsync = settings.isAsync;
  55. ajaxSleep.get(12,isAsync);
  56. ajaxSleep.get(10,isAsync);
  57. ajaxSleep.get(8,isAsync);
  58. ajaxSleep.post(6,isAsync);
  59. ajaxSleep.post(4,isAsync);
  60. ajaxSleep.post(2,isAsync);
  61. }
  62. $(document).ready(function () {
  63. //第1种case
  64. $('#btnLaunchAsync').click(function () {
  65. launch({ isAsync: true });
  66. });
  67. //第2种case
  68. $('#btnLaunchSync').click(function () {
  69. launch({});
  70. });
  71. //第2种case
  72. $('#btnLaunchQueue').click(function () {
  73. launch({ mode: 'ajaxQueue',isAsync: true });
  74. });
  75. //第3种case
  76. $('#btnLaunchSingle').click(function () {
  77. launch({ mode: 'ajaxSingle',isAsync: true });
  78. });
  79. });

default.html

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head id="Head1" runat="server">
  4. <title></title>
  5. <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
  6. <script type="text/javascript" src="js/default.js"></script>
  7. </head>
  8. <body>
  9. <form id="form1" runat="server">
  10. <input type="button" id="btnLaunchAsync" value="Launch Asynchronous Request" />
  11. <input type="button" id="btnLaunchSync" value="Launch Synchronous Request" />
  12. <input type="button" id="btnLaunchQueue" value="Launch Requested Queue" />
  13. <input type="button" id="btnLaunchSingle" value="Launch Single Request" />
  14. <div id="txtContainer"></div>
  15. </form>
  16. </body>
  17. </html>

PostPage.aspx & ResponsePage.aspx

  1. //ResponsePage.aspx
  2. protected void Page_Load(object sender,EventArgs e)
  3. {
  4. int seconds = int.Parse(Request.QueryString["second"]);
  5. Thread.Sleep(seconds*1000);
  6. Response.Write("GET: selpt for "+ seconds.ToString() +" sec(s)");
  7. }
  8. //PostPage.aspx
  9. protected void Page_Load(object sender,EventArgs e)
  10. {
  11. int seconds = int.Parse(Request.Form["second"]);
  12. Thread.Sleep(seconds * 1000);
  13. Response.Write("POST: selpt for " + seconds.ToString() + " sec(s)");
  14. }

猜你在找的Ajax相关文章