这篇文章主要介绍了用Promise解决多个异步Ajax请求导致的代码嵌套问题(完美解决方案),需要的朋友可以参考下

问题

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

var someData;
$.ajax({      url: '/prefix/entity1/action1',type: 'GET' ,async: true,contentType: "application/json",success: function (resp) {//do something on responsesomeData.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 responsesomeData.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 responsesomeData.attr1 = resp.attr1;
}).then(ajax('/prefix/entity2/action2', someData, function(resp){//do something on response}
).then(initVue() ;
).then(//do something else
)

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

  1. ajax. jquery. 异步,jQuery之异步Ajax请求使用

    $.ajax({type:'',data:'',async:''...}) 参数: 1.cache: true缓存页面 false 不缓存页面 (默认: true,dataType为script和js ...

  2. ajax调用api改表格数据库,【django基础】django接口 异步ajax请求 导出数据库成excel表(包裹前端后端)...

    py文件: from django.utils.http import urlquote from rest_framework.views import APIView from django.sh ...

  3. 解决spring-security session超时 Ajax 请求没有重定向的问题

    解决spring-security session超时 Ajax 请求没有重定向的问题 参考文章: (1)解决spring-security session超时 Ajax 请求没有重定向的问题 (2) ...

  4. php 请求拦截,解决拦截器对ajax请求的拦截实例详解

    解决拦截器对ajax请求的的拦截 拦截器配置:public boolean preHandle(HttpServletRequest request, HttpServletResponse resp ...

  5. ajax中解决乱码的问题,关于Ajax请求中传输中文乱码问题的解决方案

    今天遇到一个问题,有关ajax 请求中传输中文,遇到乱码的问题. 如下代码: function UpdateFolderInfoByCustId(folderId, folderName, custI ...

  6. ajax 传输中文乱码,关于Ajax请求中传输中文乱码问题的解决方案

    今天遇到一个问题,有关ajax 请求中传输中文,遇到乱码的问题. 如下代码: function UpdateFolderInfoByCustId(folderId, folderName, custI ...

  7. ajax请求导致status为canceled的原因

    在使用layui的form表单提交以后,请求状态总是canceled.后来在form表单的后面添加了一行代码: return false; 就可以了. 文档:https://www.layui.com ...

  8. 解决ie浏览器发送ajax请求的缓存问题

    由于ie浏览器的缓存问题,我们使用ie浏览器发送ajax请求,修改服务器js代码后,再次发送该ajax请求,ie浏览器会从缓存中查找该请求的数据,这样会导致ie显示的数据并不是最新的. 1.服务器代码 ...

  9. AJAX异步--ajax请求

    AJAX请求 这篇文章是AJAX异步文章的附加二: 这篇文章我们将的是$.ajax请求来实现异步的操作 $.ajax请求有很多,但我们主讲jQuery.ajax(url,[settings]).jQu ...

最新文章

  1. MySQL主主配置说明
  2. 廖雪峰的数据分析课!
  3. Android应用程序组件Content Provider的启动过程源代码分析(1)
  4. 使用JTextArea示例
  5. 22/11/2010
  6. 如何在线创建索引或者重构索引
  7. 小甲鱼 OllyDbg 教程系列 (十三) : 把代码和变量注入程序 以及 硬件断点
  8. 雨课堂显示服务器无法连接,雨课堂用的什么云服务器
  9. 计算机图形学基础教程论文,计算机图形学小论文
  10. 关于Netbeans调试PHP
  11. 没看过这10本程序员必读烧脑经典,别说你是敲代码的
  12. JQuery选择器及radio,checkbox,select取值和反选
  13. webpack官方文档分析(一):安装
  14. [华为机试真题][2014]63.等式变换
  15. oracle索引实验报告,Oracle之索引(Index)实例讲解
  16. 微信看涨跌30秒平台,10元微交易平台排行榜
  17. 硬盘分区故障修复全攻略
  18. jira是干什么_JIRA是什么? | 学步园
  19. 根据表一和表二写出查询结果如表三的sql语句
  20. 艾司博讯:拼多多一件代发怎么发货

热门文章

  1. 前端学习(2900):微信小程序简介
  2. “约见”面试官系列之常见面试题之第五十七篇之强制类型转换(建议收藏)
  3. 前端学习(2008)vue之电商管理系统电商系统之获取静态属性列表
  4. 前端学习(1670):前端系列实战课程之核心运动原理
  5. 前端学习(628):数字类型
  6. 第六十九期:【学习分享】温水里的程序员,技术将成为温水
  7. 第十九期:HTTPS虐我千百遍,我却待她如初恋!
  8. java学习(104):字符串equals,charAt,endwith,startwith方法
  9. python之sys
  10. java quartz 2.2.3_java – Spring 3 Quartz 2错误