Promise
大约 2 分钟
Promise是JS异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步编程解决方案之一
异步编程
fs 文件操作
request('fs').readFile('./index.html', (err,data) => {})
数据库操作
AJAX
$.get('/server',(data)=>{})
定时器
setTimeout(()=>{}, 2000)
为什么要用Promise
1.指定回调函数方式更灵活
- 旧:必须在启动异步任务前确定
- promise:启动异步任务 => 返回promise对象 => 给promise对象绑定回调函数(甚至可以在异步任务结束后指定/多个)
链式调用
解决回调地狱问题
2.支持回调地狱
asyncFunc1(opt, (...args1) => {
asyncFunc2(opt, (...args2) => {
asyncFunc3(opt, (...args3) => {
asyncFunc4(opt, (...args4) => {
// some opeeration
})
})
})
})
缺点:
- 不便于阅读
- 不便于异常处理
promise 状态
实例对象的一个属性 PromiseState
pending
未决定的resolved
/fullfilled
成功rejected
失败
只能由pending
转为resolved
或rejected
,且只能改变一次
- resolve
pending => resolved
- reject
pending => rejected
- 抛出异常
pending => rejected
promise 对象的值
实例对象的一个属性 PromiseResult
保存着对象 成功
或 失败
的结果
- resolve
- reject
promise 工作流程
常用API
Promise(executor){}
1. 构造函数 executor
: 执行器函数 (resolve, reject) => {}resolve
: 成功时调用函数 value => {}reject
: 失败时调用函数 reason => {}
- 说明:
executor
会在Promise
内部立即同步调用,异步操作在执行器中执行
Promise.prototype.then
方法: (onResolved, onRejected) => {}
2. onResolved
: 成功的回调函数 (value) => {}onRejected
: 失败的回调函数 (reason) => {}
- 说明:返回一个新的 Promise 对象
Promise.prototype.catch
方法: (onRejected) => {}
3. onRejected
: 失败的回调函数 (reason) => {}
Promise.resolve
方法: (value) => {}
4. value
: 成功的数据或 promise 对象
- 说明:返回一个成功/失败的 promise 对象,只有当
value
为失败的 promise 对象才是失败
Promise.reject
方法: (reason) => {}
5. reason
: 失败的原因
- 说明:返回一个失败的 promise 对象
Promise.all
方法: (promises) => {}
6. promises
: 包含n个 promise 的数组
- 说明:返回一个新的 promise 对象,只有所有 promise 都成功才成功,数据为所有 promise 数据组成的数组
Promise.race
方法: (promises) => {}
7. promises
: 包含n个 promise 的数组
- 说明:返回一个新的 promise 对象,第一个完成的 promise 的结果状态就是最终的结果状态