js是单线程的,也就是说一次只能完成一个任务,为了解决这个问题,js将任务的执行模式分为两种, 同步和异步,
在es5中我们处理异步只能通过的回调的方式进行处理,在多层异步中,回调会一层一层嵌套,也就是所谓的回调地狱,
promise就是异步编程的一种解决方案
Promise
特点:
-
对象的状态不受外界影响, promise对象代表一个异步操作,有三种状态pendding(进行中), fulfilled(成功), rejected(失败)
-
一旦状态改变,就不会再变, 状态的改变只有两种可能, pendding => fulfilled及pendding => rejected
基本用法:
const promise = new Promise (function(resolve, reject){ // ... some code if (/* 异步操作成功 */){ resolve(value); // 将状态从pendding变成fulfilled } else { reject(error); // 将状态从pendding变成rejected } });
promise 生成实例后可以使用then方法接收resolved状态和rejected状态的回调函数
promise.then( ()=> {
console.log('resolved')
}, () => {
console.log('rejected')
})
promise原型上具有catch方法, catch方法是rejection的别名, 用于指定发生错误时的回调函数
promise.then( ()=> { console.log('resolved') }, () => { console.log('rejected') }).catch( (err) => { console.log('catch') })
promise原型上具有finally方法,用于不管promise对象最后的状态如何,都会执行的操作
promise.then( ()=> { console.log('resolved') }, () => { console.log('rejected') }).finally( (err) => { console.log('end') })
Promise.all
Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例
简单使用:
const p = Promise.all([p1, p2, p3]);
特点:
-
参数都是promise实例,如果不是会调用promise.resolve方法将其转为promise实例
-
p的奖态由传入的promise实例的状态决定
-
promise实例状态都变成fulfilled,p状态为fulfilled
-
promise实例状态一个变成rejected,p状态为rejected
-