视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
多个异步Ajax请求导致的代码嵌套怎么解决
2020-11-27 19:57:05 责编:小采
文档


这次给大家带来多个异步Ajax请求导致的代码嵌套怎么解决,解决多个异步Ajax请求导致的代码嵌套的注意事项有哪些,下面就是实战案例,一起来看一下。

问题

前端小同学在做页面的时候,犯了个常见的错误:把多个Ajax请求顺序着写下来了,而后面的请求,对前面请求的返回结果,是有依赖的。如下面的代码所示:

var someData;
$.ajax({ url: '/prefix/entity1/action1',
 type: 'GET' ,
 async: true,
 contentType: "application/json",
 success: function (resp) {
 //do something on response
 someData.attr1 = resp.attr1;
 },
 error: function (XMLHttpRequest, textStatus, errorThrown) {
 //在这个页面里,所有的请求的错误都做同样的处理
 if (XMLHttpRequest.status == "401") {
 window.location.href = '/login.html';
 } else {
 alert(XMLHttpRequest.responseText);
 }
 }
 });
$.ajax({
 url: '/prefix/entity2/action2',
 type: 'POST' ,
 dataType: "json",
 data: JSON.stringify(someData),
 async: true,
 contentType: "application/json",
 success: function (resp) {
 //do something on response
 },
 error: function (XMLHttpRequest, textStatus, errorThrown) {
 //在这个页面里,所有的请求的错误都做同样的处理
 if (XMLHttpRequest.status == "401") {
 window.location.href = '/login.html';
 } else {
 alert(XMLHttpRequest.responseText);
 }
 }
 });

以上代码有两个问题:

*首先就是执行顺序不能保证,action2很可能在action1返回之前就发出了,导致someData.attr1这个参数没能正确传出

*其次两个ajax请求的代码重复很严重

思路

  • 代码重复的问题相对好解决,尤其是在自己的项目里,各种参数可以通过规范定死,封装一个参数更少的ajax方法就好了

  • //url:地址
    //data:数据对象,在函数内部会转化成json串,如果没传,表示用GET方法,如果传了,表示用POST方法
    function ajax(url, data, callback) {
     $.ajax({
     url: url,
     type: data == null ? 'GET' : 'POST',
     dataType: "json",
     data: data == null ? '' : JSON.stringify(data),
     async: true,
     contentType: "application/json",
     success: function (resp) {
     callback(resp);
     },
     error: function (XMLHttpRequest, textStatus, errorThrown) {
     if (XMLHttpRequest.status == "401") {
     window.parent.location = '/enterprise/enterprise_login.html';
     self.location = '/enterprise/enterprise_login.html';
     } else {
     alert(XMLHttpRequest.responseText);
     }
     }
     });
    }

    这样只有url,data和callback三个必要的参数要填,其他都定死了

  • 执行顺序的问题,可以把第二个请求放在第一个请求的回调里,形如:

  • ajax('/prefix/entity1/action1',null, function(resp){
     //do something on response
     someData.attr1 = resp.attr1;
     ajax('/prefix/entity2/action2', someData, function(resp){
     //do something on response
     }
    };

    至此问题似乎解决得很完美,但可以想见,如果请求不止两个,而是4、5个,同时还有其他异步操作(比如我们的页面里有Vue对象的初始化),相互之间有依赖关系,光是这样层层叠叠的括号嵌套,就已经让人头晕了。

    需要找到一种方法,让异步调用的表达看起来像同步调用一样。

    正好最近看了阮一峰老师关于ES6的书,而且用户也没有强硬要求兼容IE浏览器,于是就选择了Promise的方案

    解决方案

  • 引入Promise

  • 其实现代浏览器都已经内置支持了Promise,连第三方库都不需要了,只有IE不行,放弃了

  • 改造ajax封装函数,在成功的时候调用resolve(),失败的时候调用reject(),并且返回Promise对象

  • function ajax(url, data, callback) {
     var p = new Promise(function (resolve, reject) {
     $.ajax({
     url: url,
     type: data == null ? 'GET' : 'POST',
     dataType: "json",
     data: data == null ? '' : JSON.stringify(data),
     async: true,
     contentType: "application/json",
     success: function (resp) {
     callback(resp);
     resolve();
     },
     error: function (XMLHttpRequest, textStatus, errorThrown) {
     if (XMLHttpRequest.status == "401") {
     window.parent.location = '/enterprise/enterprise_login.html';
     self.location = '/enterprise/enterprise_login.html';
     } else {
     alert(XMLHttpRequest.responseText);
     }
     reject();
     }
     });
     });
     return p;
    }
  • 修改调用端

  • ajax('/prefix/entity1/action1',null, function(resp){
     //do something on response
     someData.attr1 = resp.attr1;
    }).then(
     ajax('/prefix/entity2/action2', someData, function(resp){
     //do something on response
     }
    ).then(
     initVue() ;
    ).then(
     //do something else
    )

    相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

    推荐阅读:

    C与View之间怎么进行数据交流

    Ajax交互时被报status=parsererror错误如何解决

    下载本文
    显示全文
    专题