- 为了解决回调地狱的问题 使用promise,promise是异步变成的解决方法
- promise是一个构造函数,通过new promise来创建 构造函数的参数是一个回调函数,这个回调函数有两个参数分别是resolve和reject,异步请求成功执行resolve 异步请求失败执行reject
- 分别有三种状态pending(进行中),fulfilled(已完成),和rejected(失败)的状态一旦改变不能在更改
new Promise((resolve, reject) => {
// 模拟异步
setTimeout(() => {
resolve(123)
}, 1000)
})
.then((res) => {
console.log(res) //123
return 345
})
.then((res1) => {
cosnsole.log(res1)
})
.catch((err) => {
// catch用来捕获错误的 可以捕获reject抛出的错误
// then()方法指定的回调函数,如果运行中抛出错误,也会被catch()方法捕获。
console.log(err, 0)
})
// 三个异步都变成fullfilled Promise.all([异步1,异步2,异步3])变成fullfilled
Promise.all([异步1, 异步2, 异步3]).then((res) => {
// res==[异步1结果,异步2结果,异步3结果]
})
// 三个异步只要有一个变成fullfilled Promise.all([异步1,异步2,异步3])变成fullfilled
Promise.race([异步1, 异步2, 异步3]).then((res) => {
// res==[异步1结果,异步2结果,异步3结果]
})
回调函数
arr.forEach((item)=>{})
arr.every((item)=>{})
function fn1(callback) {
var a = 10
var b = 23
// 进行不同的操作
callback && callback()
}
比如获取当前城市
先从本地读取,本地有 就返回本地 本地没有接口调用再存储到本地 再返回
function getCurCity(callback) {
// 本地读取
let curcity = JSON.parse(localStorage.getItem('localcity'))
// 判断本地有没有
if (!curcity) {
// 没有 请求获取
axios
.get('http://shiyansong.cn:8080/area/info?name=北京')
.then((res) => {
// console.log(res.data.body)
// 本地存储
localStorage.setItem('localcity', JSON.stringify(res.data.body))
callback && callback(res.data.body)
})
} else {
// 有 读取本地数据
callback && callback(curcity)
}
}
getCurCity((city) => {
console.log(city, 'city')
})