Promise
-
Promise简介
—Promise是异步编程的一种解决方案,将网络请求和异步处理代码进行分离;
—什么时候处理异步事件?
比较常见的场景就是网络请求!我们封装一个网络请求的函数,不会立即拿到结果,往往会传入另一个函数,在数据请求成功时,将数据通过传入的函数回调出去;如果网络请求非常复杂时,会出现回调地狱;
定时器的异步事件
—Promise可以对异步事件进行封装;
—Promise传入一个回调函数,回调函数中传入两个参数
resolve
和reject
,这两个参数本身也是函数;—异步事件处理(链式编程):
(1)通过
new
构造函数,保存了一些状态信息,并且执行传入的回调函数;(2)在执行传入的回调函数时,会传入两个参数,
resolve
和reject
,这两个参数本身又是函数;(3)网络请求成功调用
resolve
,然后再then()
中进行数据处理;失败就调用reject
,在catch()
中捕捉错误信息;new Promise((resolve,reject)=>{ //这里相当于简单的网络请求 setTimeout(()=>{ //网络请求成功调用resolve resolve('Hello World') //网络请求失败,就将网络错误信息传递给reject reject('error message') },1000) //而then()用于处理网络请求 }).then(data=>{ //打印的是setTimeout中的Hello World console.log(data) }).catch(err => { console.log(err) })
Promise的三种状态
—
pending
:等待状态,比如正在进行网络请求,或者定时器没有到时间;—
fulfill
:完成状态,当我们主动回调了resolve
时,就处于该状态,并且会回调then()
进行数据处理;—
reject
:拒绝状态,当我们主动回调了reject
时,就处于该状态,并且回调catch()
实现错误捕捉;—
Promise
的另一种处理形式,可以直接在then()
中传入两个函数,分别用于处理完成状态和拒绝状态:new Promise((resolve,reject) => { setTimeout(()=>{ resolve('Hello World') reject('error message') },1000) }).then(data=>{ console.log(data) },err=>{ console.log(err) })
链式调用
—在
Promise
中,无论then
还是catch
都可以返回一个Promise
对象;—简写:
Promise.resolve(res+'111')
—链式调用实例:
new Promise(resolve => { setTimeout(()=>{ resolve('aaa') },1000) }).then(res=>{ console.log(res) return new Promise(resolve=>{ resolve(res+'111') }) //简写 return Promise.resolve(res+'111') //省略掉Promise.resolve,内部会进行Promise包装 return res+'111' }).then(res=>{ console.log(res) return res+'222' }).then(res=>{ console.log(res) })
—可以通过
return Promise.reject('error')
,也可以通过throw 'error'
抛出异常;Promise
的all
方法—
all
可以同时处理多个网络请求,传入的对象为可迭代对象,比如数组;—例如:
Promise.all([ new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve('result1') },1000) }), new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve('result2') },2000) }) ]).then(results=>{ //两个处理结果可以一起放入数组中统一返回 console.log(results) })