为什么会有promise?
- 之前处理异步是通过纯粹的回调函数的形式进行处理
- 很容易进入到回调地狱中。
- 问题可以解决,但是难以读懂,维护困难
- 稍有不慎就会踏入回调地狱 - 嵌套层次深,不好维护
Promise的注意点
.then()
当promise状态发生改变,就会触发then()里的响应函数处理后续步骤;
如果返回新的promise,那么下一级.then()会在新的promise状态改变之后执行
如果返回其他任何值,则会立即执行下一级.then()
.chtah()
错误响应时候返回内部值
用法:解决了回调地狱的问题
// 需求:当我获取到服务器传回来的地址后,我才能发送第二个ajax
function fn(url) {
let p = new Promise((resolve, reject) => {
axios({
url: url,
method: "get",
}).then((res) => {
//成功回调
// console.log(res.status);
// 成功获取服务器发送过来的ajax
if (res.status == 200) {
// 成功响应
// resolve(res.data.list[i].goods_img):意思就是我这个Promise:P自带参数
//resolve为操作成功时
resolve(res.data);
}
});
});
// 调用函数之后必须要有返回值,
//这里要返回一个Promise,在里面有从服务器接收到的信息
return p;
}
fn("https://www.escook.cn/api/cart")
.then((rs) => {
// console.log(rs);
// 我从服务器获取到的rs地址
// return之后继续获取ajax服务器信息
return fn("https://www.escook.cn/api/cart");
})
.then((rs) => {
console.log(rs);
});
Promise 配合 async await使用
async function fn1() {
function fn(url) {
let p = new Promise((resolve, reject) => {
axios({
url: url,
method: "get",
}).then((res) => {
//成功回调
// console.log(res.status);
// 成功获取服务器发送过来的ajax
if (res.status == 200) {
// 成功响应
resolve(res.data);
}
});
})
// 调用函数之后必须要有返回值,这里要返回一个Promise,在里面有从服务器接收到的信息
return p;
}
let a = await fn("https://www.escook.cn/api/cart");
let b = await fn("https://autumnfish.cn/api/joke/list?num=1");
console.log(a);
console.log(b);
}
async await 和 promise 的区别
- async/await 出现的异常是无法捕获的,需要借助 try/catch 来捕获异常
- 任何一个await后面的promise对象变为reject,那么整个async都会被中断
- 使用 async await 的话,catch 能处理 JSON.parse 错误
try和catch的用法
try 语句使你能够测试代码块中的错误。
catch 语句允许你处理错误。
finally 使你能够执行代码,在 try 和 catch 之后,无论结果如何。
try{
代码块;
} catch(参数){
处理错误并执行
}finally{
无论try catch结果如何还是继续执行
}