Promise是什么?
- 抽象表达:
- Promise是一门新的技术(ES6规范)
- Promise是JS中进行异步编程的新的解决方案。
(旧方案是单纯的使用回调函数)
备注:异步编程包括fs文件操作,数据库操作,AJAX,定时器
- 具体表达:
- 从语法上来说:Promise就是一个构造函数
- 从功能上来说:Promise对象用来封装一个异步操作并可以获取其成功或者失败的和结果值。
为什么要用Promise?
指定回调函数的方式和更加灵活
- 旧的:必须在启动异步任务前指定
- promise:启动异步任务=>返回promise对象=>给promise对象绑定回调函数。(甚至可以在异步任务结束后指定多个)
支持链式调用,可以解决回调地狱的问题。
1. 什么是回调地狱?
回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调的执行的条件。
getData() {
axios.get("./mock/data_a.json").then((res1) => {
console.log(res1.data.code);
axios.get("./mock/data_b.json").then((res2) => {
console.log(res2.data.code);
axios.get("./mock/data_c.json").then((res3) => {
console.log(res3.data.code);
});
});
});
},
2. 回调地狱的缺点?
(1) 嵌套过多会影响代码的可读性和逻辑
(2) 当某个请求失败时难以定位问题,这情况被称为回调地狱
3. 解决方案?
promise链式调用
methods:{
getData1(url) {
return new Promise((resolve, reject) => {
axios.get(url).then((res1) => {
if (res1.data.code <= 1) {
resolve("成功");
} else {
reject("失败");
}
});
});
},
}
mounted(){
this.getData1("./mock/data_a.json")
.then((res) => {
console.log(res);
return this.getData1("./mock/data_b.json");
})
.then((res) => {
console.log(res);
return this.getData1("./mock/data_c.json");
})
.then((res) => {
console.log(res);
})
.catch((err) => {
console.log(err);
});
}