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

这篇文章主要介绍了用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
)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[css] 使用css3实现一个斑马线的效果

[css] 使用css3实现一个斑马线的效果 ferrinweb 如果需要很多或者无限扩展的斑马线&#xff0c;你这个方案就有缺点了 cxwht 你的方案需要增加额外的元素&#xff0c;不太理想 最好的办法是用渐变背景实现 linear-gradient( [ [ <angle> | [top | bottom] || [left | ri…

最详细的后缀数组

写在前面&#xff1a; 多余的我就不提了&#xff0c;只是觉得网上的博客吧流程&#xff0c;每个数组存的是下标还是值&#xff0c;都讲的不是很清楚&#xff08;让我这种蒟蒻很是困扰&#xff09; 相信到现在这种水平的都可以知道什么是倍增&#xff0c;为什么能倍增都比较清楚…

promise简单封装ajax 完美嵌套多个ajax请求

转载请注明出处并留个言哈&#xff0c;分享快乐~&#xff01; request.js文件&#xff0c;注意网页头部script标签加载顺序 function myAjax(json, callback) {var p new Promise(function (resolve, reject) {$.ajax({url: json.url, //请求的url地址dataType: json.dat…

[css] 使用纯css来创建一个滑块

[css] 使用纯css来创建一个滑块 .checke{position: relative;-webkit-appearance: none;width:90px;height: 44px;line-height: 44px;background: #eee;border-radius: 30px;outline: none;}.checke:before{position: absolute;left: 0;content: ;width: 44px;height: 44px;bor…

纯静态网站模板封装header和footer

前后端分离的网站模板&#xff0c;如果不用任何渲染引擎&#xff0c;能否封装公共的header和footer&#xff08;或其它html公共代码呢&#xff09;&#xff1f; 答案是肯定的&#xff0c;因为jQuery有一个函数叫 load &#xff0c;可以在浏览器绘制页面之前加载完整的 html 页…

SAP字体调节大小

登陆SAP 之后&#xff0c;菜单下面一行&#xff0c;最右边的那个彩色按钮&#xff08;SAP GUI&#xff09;&#xff0c;点击“选项”-可视设计-字体设计-固定狂赌字体设计&#xff0c;点击&#xff1a;选择字体 即可。转载于:https://www.cnblogs.com/RogerLu/p/9612648.html

javascript中对一个对象数组按照对象某个属性进行排序

在javascript中&#xff0c;对象和数组是两种不同的类型&#xff0c;这和php中的数组概念不同。在javascript中&#xff0c;也有一些精妙的算法&#xff0c;用来对一些对象进行排序。我在面试迅雷的时候&#xff0c;也拿到一道题&#xff0c;当时做题的时候考虑到时间&#xff…

[css] 用css画一个五边形和一个六边形

[css] 用css画一个五边形和一个六边形 五边形&#xff1a;clip-path: polygon(50% 0%, 100% 38%, 82% 100%, 18% 100%, 0% 38%); 六边形&#xff1a;clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%); 七边形&#xff1a;clip-path: polygon(50% 0%…

[css] 你有没有使用过“形似猫头鹰”(例:`* + *{ ... }`) 的选择器?

[css] 你有没有使用过“形似猫头鹰”&#xff08;例&#xff1a;* *{ ... }&#xff09; 的选择器&#xff1f; 以前常用&#xff0c;比如li li {margin-top: 1rem; } 这样可以给除了第一个li以外的li指定样式&#xff0c;比如在两个li之间加上margin个人简介 我是歌谣&…

HTML5 Web 存储(localStorage和sessionStorage)

localStorage生命周期是永久&#xff0c;除非主动清除localStorage信息&#xff0c;否则这些信息将永远存在。存放数据大小为一般为5MB,而且它仅在客户端&#xff08;即浏览器&#xff09;中保存&#xff0c;不参与和服务器的通信。 // 1、保存数据到本地// 第一个参数是保存的…

面向对象之反射、包装、(定制)

什么是反射&#xff1f; 反射的概念是由Smith在1982年首次提出的&#xff0c;主要是指程序可以访问、检测和修改它本身状态或行为的一种能力&#xff08;自省&#xff09;&#xff0c; 这一概念的提出很快引发了计算机科学领域关于应用反射的研究。它首次被程序语言的设计领域所…

[css] 为什么说css中能用子代选择器的时候不要用后代选择器?

[css] 为什么说css中能用子代选择器的时候不要用后代选择器&#xff1f; 选择从右到左依次解析匹配&#xff0c;所以后代选择器会去找它的所有父级&#xff0c; 而子代选择器只会选择直接的父级&#xff1b;减少匹配次数&#xff0c;提高效率个人简介 我是歌谣&#xff0c;欢…

javascript基本函数

如何使用jquery刷新当前页面 下面介绍全页面刷新方法&#xff1a;有时候可能会用到 window.location.reload()刷新当前页面. parent.location.reload()刷新父亲对象&#xff08;用于框架&#xff09; opener.location.reload()刷新父窗口对象&#xff08;用于单开窗口&…

[css] 如何给文字的color设置渐变

[css] 如何给文字的color设置渐变 .text {background: -webkit-linear-gradient(#eee, #333);-webkit-background-clip: text;-webkit-text-fill-color: transparent; }个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。…

微信小程序运行报错---invoke event

微信小程序页面跳转 //跳转到新的页面&#xff0c;新的页面带有返回按钮&#xff0c;不能跳转到tabBar页面&#xff0c;否则会报invoke event之类的错误 wx.navigateTo({url: }) //跳转到新的页面&#xff0c;不带返回按钮&#xff0c;但是不能太偶转到tabBar页面&#xff0…

js 静止f1到f12 和屏蔽鼠标右键

//静止键盘f1-f12 function testKeyDown(event) { if ((event.keyCode 112) || //屏蔽 F1 (event.keyCode 113) || //屏蔽 F2 (event.keyCode 114) || //屏蔽 F3 (event.keyCode 115) || //屏蔽 F4 //(event.keyCode 116) || //屏蔽 F5 (event.keyCode 117) || //屏蔽 F6…

[css] 如何在白天和黑夜自动切换页面的颜色?

[css] 如何在白天和黑夜自动切换页面的颜色&#xff1f; 媒体查询的内容都是设备的属性&#xff1a;宽度高度&#xff0c;旋转方向&#xff0c;打印样式&#xff0c;分辨率 所以用媒体查询的话&#xff0c;需要用户的设备拥有切换黑暗模式的功能 借助 js 切换页面颜色的话&…

py 的 第 30 天

首先学习了一下socket&#xff0c;这个经过周末作业总算是掌握精髓了&#xff0c;可能还没掌握只是以为掌握了? import socketserverclass MyServer(socketserver.BaseRequestHandler):def handle(self):passserver socketserver.ThreadingTCPServer((192.168.13.84,8001,),M…

Error: Cannot find module 'webpack-cli'--解决方案

npm install webpack-cli -g 全局安装解决 今日赠语&#xff1a; 哈佛大学研究心理学表示&#xff1a; 1、床乱糟糟的人&#xff0c;比穿整洁的人&#xff0c;创造力平均要高出50% 2、经常迟到的人&#xff0c;比不迟到的人&#xff0c;幽默感平均要高出70% 3、饭量大的人&…

[css] CSS中哪些属性会引起GPU渲染,会增加耗电吗?

[css] CSS中哪些属性会引起GPU渲染&#xff0c;会增加耗电吗&#xff1f; 肆无忌惮的开启GPU硬件加速&#xff0c;会导致大量消耗设备电量&#xff0c;降低电池寿命等问题。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很…