• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    用Promise解决多个异步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请求的代码重复很严重

    思路

    //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,连第三方库都不需要了,只有IE不行,放弃了

    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
    )

    以上所述是小编给大家介绍的用Promise解决多个异步Ajax请求导致的代码嵌套问题(完美解决方案),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

    您可能感兴趣的文章:
    • 在vue项目中promise解决回调地狱和并发请求的问题
    • promise处理多个相互依赖的异步请求(实例讲解)
    • js利用递归与promise 按顺序请求数据的方法
    • 利用Promise自定义一个GET请求的函数示例代码
    • JavaScript如何利用Promise控制并发请求个数
    上一篇:使用Ajax、json实现京东购物车结算界面的数据交互实例
    下一篇:Ajax 传递JSON实例代码
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    用Promise解决多个异步Ajax请求导致的代码嵌套问题(完美解决方案) 用,Promise,解决,多个,异步,