最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

多个异步Ajax请求导致的代码嵌套怎么解决

来源:动视网 责编:小采 时间:2020-11-27 19:57:05
文档

多个异步Ajax请求导致的代码嵌套怎么解决

多个异步Ajax请求导致的代码嵌套怎么解决:这次给大家带来多个异步Ajax请求导致的代码嵌套怎么解决,解决多个异步Ajax请求导致的代码嵌套的注意事项有哪些,下面就是实战案例,一起来看一下。问题前端小同学在做页面的时候,犯了个常见的错误:把多个Ajax请求顺序着写下来了,而后面的请求,对前面请求
推荐度:
导读多个异步Ajax请求导致的代码嵌套怎么解决:这次给大家带来多个异步Ajax请求导致的代码嵌套怎么解决,解决多个异步Ajax请求导致的代码嵌套的注意事项有哪些,下面就是实战案例,一起来看一下。问题前端小同学在做页面的时候,犯了个常见的错误:把多个Ajax请求顺序着写下来了,而后面的请求,对前面请求


这次给大家带来多个异步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错误如何解决

    文档

    多个异步Ajax请求导致的代码嵌套怎么解决

    多个异步Ajax请求导致的代码嵌套怎么解决:这次给大家带来多个异步Ajax请求导致的代码嵌套怎么解决,解决多个异步Ajax请求导致的代码嵌套的注意事项有哪些,下面就是实战案例,一起来看一下。问题前端小同学在做页面的时候,犯了个常见的错误:把多个Ajax请求顺序着写下来了,而后面的请求,对前面请求
    推荐度:
    标签: 请求 的代码 嵌套
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top