ES6中的promise
promise是异步编程的一种解决方法
Promise对象的特点:
一、对象的状态不受外界的影响,Promise有三种状态:Pending(进行中)、fulfilled(已成功)、rejected(失败),只用异步操作的结果可以决定当前是哪一种状态,其他任何操作都无法改变这个操作。
二、一旦状态改变之后就不会再改变。任何时候都可以得到这个结果。状态变化只有两种可能:从pending到fulfilled和从pending到rejected。只要改变就已经定型了。
promise对象的用法
promise.prototype的原型上有then和catch方法
promise.then()用法
Promise实例生成以后, 可以用then方法分别指定Resolved状态和Reject状态的回调函数。
then方法可以接受两个回调函数作为参数。
第一个回调函数是Promise对象的状态变为Resolved时调用, 第二个回调函数是Promise对象的状态变为Reject时调用。
其中, 第二个函数是可选的, 不一定要提供。
promise.catch()用法
catch方法是用于指定发生错误时的回调函数
在执行resolve的回调( 也就是上面then中的第一个参数) 时,
如果抛出异常了( 代码出错了), 那么并不会报错, 而是会进到这个catch方法中。
const test = new Promise((resolve, reject) => {
resolve(1)
})
test.then(data => {
console.log(data);//1
throw ('mistake')
}).catch(err => {
console.log(err); //mistake
//当抛出异常时,会在catch方法中捕捉到这个异常
})
promise对象是构造函数本身携带的常用方法
promise.resolve(),promise.reject()用法
resolve函数的作用 : 将Promise对象的状态从’未完成’变为’成功’,在异步操作成功时调用,并将异步操作的结果作为参数传递出去
reject函数的作用:将Promise对象的状态从’未完成’变为’失败’,在异步操作失败时调用,并将异步操报出的错误作为参数传递出去
const p = new Promise((resolve, reject) => {
const random = Math.random();
if (random > 0.5) {
resolve(random + '大于0.5');
} else {
reject(random + '小于0.5')
}
})
const reslut = p.then(data => {
console.log(data)//当随机数大于0.5 结果会传入data里面
return data
}, err => {
console.log(err)//当随机输小于0.5时,结果会传入err里面
return err
})
console.log(result)
Promise.all()用法
Promise.all方法用于将多个Promise实例包装成一个新的Promise实例.
all接收一个数组参数,里面的值最终都算返回Promise对象。
三个异步操作同时执行,执行完后,就会进入到then。
all会把所有异步操作的结果放在一个数组里传给then
function test1() {
const p = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('测试一完成');
resolve('test1')
}, 3000)
})
return p
}
function test2() {
const p = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('测试二完成');
resolve('test2')
}, 3000)
})
return p
}
function test3() {
const p = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('测试三完成');
resolve('test3')
}, 3000)
})
return p
}
Promise.all([test1(), test2(), test3()]).then(datas => {
console.log(datas)
})
promise.race()用法
race()方法与all()方法类似,不同的是race()方法谁运行的最快,则以谁为基准,返回执行最快的那个结果。
我们把上面test1,test2,test3中setTimeout的延时分别改为3000,2000,4000,调用race()方法
Promise.race([test1(), test2(), test3()]).then(datas => {
console.log(datas)
})
从控制台输出可以看到test2的延时最短,race()方法只返回了最快的那一个结果
本文地址:https://blog.csdn.net/HLHis1996/article/details/111144225