Promise
什么是pomise
let pro1 = new Promise((resolve, reject) => {
// 默认情况下pro1为padding状态
// 在函数中调用不同的方法,转换成不同的状态
// 1,调用resolve函数转换为成功状态
// resolve(123)
// 2,调用reject()函数转换为失败状态
})
console.log(pro1);
promise作用
解决回调地狱(嵌套了很多层的回调函数):一个异步操作需要等待之前的异步操作完成,无论是事件还是函数,都会陷入不断地嵌套
并没有完全的解决回调,只是把过程写的更加简单可控
//异步场景:做作业,当一门作业做完后才会做下一门作业
function doHomework(homework, callback) {
setTimeout(() => {
console.log(`开始做${homework}作业`);
if (Math.random() > 0.5) {
callback(true)
} else {
callback(false)
}
}, 2000)
}
doHomework('数学', (result) => {
if (result) {
console.log('作业做完了');
doHomework('语文', (result) => {
if (result) {
console.log('作业做完了');
doHomework('英语', (result) => {
if (result) {
console.log('作业做完了');
} else {
console.log('作业没做完');
}
})
} else {
console.log('作业没做完');
}
})
} else {
console.log('作业没做完');
}
})
promise封装ajax
// 封装ajax
let proAjax = new Promise((resolve, reject) => {
$.ajax({
url: '/api/poisearch.json',
method: 'get',
datatype: 'json',
success(data) {
resolve(data)
},
error(err) {
reject(err)
}
})
})
proAjax.then(data => {
console.log(data);
}, err => {
console.log(err);
})
promise特点
promise的状态不受外界影响
共有三种状态
1,padding,初始状态
2,resolvede(fulfilled),成功状态
3,rejected,失败状态
只有一部操作的结果可以决定当前状态,其他操作无法改变当前状态
promise状态一旦改变,就不会在变(状态改变不可逆),而且只能有两种变化,从padding状态到fulfilled 或者padding到rejected
// 打印顺序,a,c,d,b
// 原因:promise在padding状态下的代码执行是同步的,会优先执行,所以先打印 a ,然后c打印也是同步的,其中定时器和then方法中的代码时异步的
// 都会放在任务队列中,不过then方法中的代码是在微队列中,定时器代码在宏队列中所以先打印 d 在打印 b
let pro3 = new Promise((resolve, reject) => {
console.log('a');
setTimeout(() => {
console.log('b');
}, 0)
resolve('d')
})
// then方法:可以传递两个参数,一个是resolve状态执行,一个是rejected状态执行
pro3.then(data => {
console.log(data);
}, (err) => {
console.log(err);
})
console.log('c');
promise中的方法
原型方法(实例方法)
- then()
chach()
finally():当promise为已决阶段是运行,没有参数,用来测试promise
构造函数方法(静态方法)
-
resolve方法
reject方法- 如果方法中传递的是一个promise对象,则直接返回这个promise对象
-
all():参数为一个数组,数组中全部都是promise对象,如果所有对象的状态都为resolve,则会返回一个新的promise对象状态为resolve,如果有一个为rejected则返回一个新的promise对象状态为rejected
-
race(arr):比的是速度,当参数中第一个promise对象完成时,则返回的新对象的状态与第一个完成的对象的状态相同
async,await关键字:简化promise写法
// async:函数修饰符,被修饰的函数一定返回一个promise对象
// awiat:相当于then方法,但是必须写在anync关键字的函数中,如果await后边不是promise对象则直接返回后边的语句
async function text() {
return 1 //使用return,推出去的状态为resolved
// throw 2 //使用throw,推出去的状态为rejected
}
async function text2() {
let data = await text() //await:可以拿到text中返回的值 为1
console.log(data);
}
let p1 = text()
console.log(p1); //默认为resolved状态,值为undefined
let p2 = text2()