摘要:一涉及技术二简介官方文档三种状态进行中已完成,又称已失败只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。
一、涉及技术
jquery、vue、php
二、Promise简介MDN官方文档:Promise
三种状态:
Pending(进行中)
Resolved(已完成,又称 Fulfilled)
Rejected(已失败)
只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。
三、常用方法Promise.resolve()
Promise.reject()
Promise.prototype.catch()
Promise.prototype.then()
Promise.all()
Promise.race()
四、简单示例 1、多个Promise使用var promise = new Promise(function(resolve, reject) { setTimeout(function() { resolve("hello"); }, 1000); }); promise.then(function(str) { return new Promise(function(resolve, reject) { setTimeout(function() { resolve(str+" world"); }, 1000); }); }).then(function(str) { return new Promise(function(resolve, reject) { setTimeout(function() { resolve(str+" !"); }, 1000); }); }).then(function(str) { console.log(str); // 3秒后打印 hello world ! });2、catch与finaly
var promise = new Promise(function(resolve, reject) { setTimeout(function() { reject("异步报错~"); }, 1000); }).catch(function(err) { // 捕获reject暴露的错误 console.log(err); }).finally(function() { // 不管resolve/reject都执行 console.log("complete"); });五、前后端配合 1、单个Promise
后端数据
demo.php
// 获取随机字符串 function getRandChar($length) { $str = ""; $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"; $max = strlen($strPol)-1; for($i=0;$i<$length;$i++){ $str.=$strPol[rand(0,$max)]; } return $str; } if($_GET["action"] == "test") { $data = [ ["name"=>getRandChar(6), "age"=>rand(1,50)], ["name"=>getRandChar(6), "age"=>rand(1,50)], ["name"=>getRandChar(6), "age"=>rand(1,50)], ["name"=>getRandChar(6), "age"=>rand(1,50)], ]; echo json_encode($data); }
前端页面
demo.html
promise
- {{ index }} {{ item.name }}
运行结果:
2、Promise.all()Promise.all(p1, p2, ...),此方法需要所有的promise都成功才成功。。
var promise1 = new Promise(function(resolve, reject) { $.ajax({ type: "get", url: "demo.php?action=test", dataType: "json", success: function(res) { resolve(res); }, error: function() { reject("请求报错~"); } }); }); var promise2 = new Promise(function(resolve, reject) { $.ajax({ type: "get", url: "demo.php?action=test", dataType: "json", success: function(res) { resolve(res); }, error: function() { reject("请求报错~"); } }); }); var promiseAll = Promise.all([promise1, promise2]); promiseAll.then(function(data) { console.log(data); }, function(err) { console.log(err); });
结果
如果我们把其中一个url 改成 demo2.php?action=test 就会请求失败~
Promise.all() 和 jquery的$.when() 有些类似
$.when()的写法
var ajax1 = $.ajax({type: "get", url: "demo1.php", data: {}, dataType: "json"}), ajax2 = $.ajax({type: "get", url: "demo2.php", data: {}, dataType: "json"}), ajax3 = $.ajax({type: "get", url: "demo3.php", data: {}, dataType: "json"}); $.when([ajax1, ajax2, ajax3]).then(function(data1, data2, data3) { console.log(data1, data2, data3); }, function() { console.log("%c 请求报错~", "color: red"); });3、Promise.race()
Promise.race(p1, p2, ...),这个方法会返回率先成功的那个,如果都不成功,则执行reject。
var promise1 = new Promise(function(resolve, reject) { $.ajax({ type: "get", url: "demo.php?action=test", dataType: "json", success: function(res) { resolve(res); }, error: function() { reject("请求报错~"); } }); }); var promise2 = new Promise(function(resolve, reject) { $.ajax({ type: "get", url: "demo.php?action=test", dataType: "json", success: function(res) { resolve(res); }, error: function() { reject("请求报错~"); } }); }); var promiseRase = Promise.race([promise1, promise2]); promiseRase.then(function(data) { console.log(data); }, function(err) { console.log(err); });4、多个ajax请求
var app = new Vue({ el: "#app", data: { list: [] }, methods: { ajaxReq: function(resolve, reject) { $.ajax({ type: "get", url: "demo.php?action=test", dataType: "json", success: function(res) { resolve(res); }, error: function() { reject("请求报错~"); } }); } }, mounted: function() { var promise1 = new Promise((resolve, reject) => { this.ajaxReq(resolve, reject); }); promise1.then((data)=> { console.log("第一次:", data); return new Promise((resolve, reject) => { this.ajaxReq(resolve, reject); }); }).then((data) => { console.log("第二次:", data); return new Promise((resolve, reject) => { this.ajaxReq(resolve, reject); }); }).then((data) => { console.log("第三次:", data); }); } });
这是使用了函数封装,实际上项目中,可能不是这样的,连贯操作,可能是下一个请求需要上一个请求的返回值
var promise1 = new Promise((resolve, reject) => { $.ajax({ type: "get", url: "demo.php?action=test", dataType: "json", success: function(res) { resolve(res, 2); }, error: function() { reject("请求报错~"); } }); }); promise1.then((data)=> { if(data.length > 0) { return new Promise((resolve, reject) => { $.ajax({ type: "get", url: "demo.php?action=test", dataType: "json", success: function(res) { resolve(res.concat(data)); // 因为resolve只能接口一个参数,所以concat了一下 }, error: function() { reject("请求报错~"); } }); }); } }).then((data1) => { console.log(data1); });
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/89384.html
摘要:一简介函数是引入的新型函数,用于异步编程,跟对象联合使用的话会极大降低异步编程的编写难度和阅读难度。二简单示例和注意函数不能直接使用,是通过方法获取的返回结果,而可以提前终止函数。 一、简介 Generator函数是ES6引入的新型函数,用于异步编程,跟Promise对象联合使用的话会极大降低异步编程的编写难度和阅读难度。 与普通函数的区别: function关键字与函数名之间有一个...
摘要:指的是计算机系统的一种运行机制。环境中的执行顺序是随机的这一次,彻底弄懂执行机制的规范和实现 showImg(https://segmentfault.com/img/remote/1460000012913034?w=800&h=421); Event Loop指的是计算机系统的一种运行机制。JavaScript采用此机制解决单线程引发相关问题 在浏览器中的web应用会涉及到.Jav...
摘要:最近看了一下项目,它是基于创建的项目创建项目安装默认手动选择配置,看个人项目需求支持使用书写源码支持。支持代码风格检查和格式化。权限验证那里也做了递归的处理不显示在菜单栏。组件内的在组件内使用可以拿到 最近看了一下vue-element-admin项目,它是基于vue-cli3创建的项目 创建vue-cli3项目 安装vue-cli npm install -g @vue/cli v...
阅读 1223·2021-09-01 10:30
阅读 2100·2021-07-23 10:38
阅读 871·2019-08-29 15:06
阅读 3057·2019-08-29 13:53
阅读 3261·2019-08-26 11:54
阅读 1775·2019-08-26 11:38
阅读 2352·2019-08-26 10:29
阅读 3109·2019-08-23 18:15