一、概述
Promise是异步编程的一种解决方案,可以替代传统的解决方案--回调函数和事件,解决函数回调地狱,让代码更好维护。ES6统一了用法,并原生提供了Promise对象。作为对象,Promise有以下两个特点:
(1)对象的状态不受外界影响。
(2)一旦状态改变了就不会再变,也就是说任何时候Promise都只有一种状态。
等待 => 成功 失败(resolve, reject)状态驱动
二、Promise的状态
Promise有三种状态,分别是 Pending (进行中)、Resolved (已完成)、Rejected (已失败)。Promise从Pending状态开始,如果成功就转到成功态,并执行resolve回调函数;如果失败就转到失败状态并执行reject回调函数。
三、基本用法
通过Promise的构造函数创建Promise对象
function getPromise(){
const promise = new Promise((resolve, reject) => {
resolve('成功');
reject('失败');
})
}
getPromise().then(res => {
console.log(res) //'成功'
}).catch(err => {
console.log(err) //'失败'
})
Promise构造函数接受一个函数作为参数,该函数的两个参数是 resolve ,reject,它们由JavaScript引擎提供。其中 resolve 函数的作用是当Promise对象转移到成功,调用resolve并将操作结果作为其参数传递出去;reject 函数的作用是当Promise对象的状态变为失败时,将操作报出的错误作为参数传递出去。
promise的then方法带有一下三个参数:成功的回调,失败的回调,前进的回调。一般情况下只需要实现第一个,后面的是可选的。Promise中最为重要的状态,通过then的状态传递可以实现的回调函数链式操作的实现。
promise执行then还是一个promise,并且Promise的执行是异步的。因为Promise执行then后还是Promise,所以就可以根据这一特性,不断的链式调用回调函数。
promise 属于构造函数,是一个宏任务,会立即执行,只执行一次,.then方法可以多次调用。
promise.all
function fn(){ return new Promise((resolve,reject)=>{ let randomNum = parseInt(Math.random()*6+1); console.log(randomNum); if(randomNum>3){ resolve('买'); } else{ reject('不买'); } }) } Promise.all([fn(),fn()]).then((x)=>{console.log(x,'success')},(y)=>{console.log(y,'error');});
Promise.all 里面参数为一个数组,数组的每一项是一个返回promise 的函数调用
then 的第一个参数是所有promise都成功的调用,返回结果是一个数组,数组的每一项为函数promise 的返回结果。
then 的第二个参数:返回结果有一个失败则执行失败的回调,拿到的是第一个失败的值