Promise 是承诺,是新时代人民对美好生活的期待!
Promise A+ 是开发者制定的 JavaScript Promise 标准。
将回调函数 Promise 化
(()=>new Promise(resolve=>setTimeout(()=>resolve('终值'))))().then(data=>console.log(data)) // 终值
Promise 有三个状态:等待(Pending)完成(Fulfilled)拒绝(Rejected) 状态转换关系:
等待态 → 完成态,并提供终值
等待态 → 拒绝态,并提供拒绝原因
状态转换特点:
如果入参是:
then
方法:返回等待态的 Promise 对象,立即执行 then
方法后,变完成态入参作为拒绝原因
入参为可迭代对象,包括数组、字符串、Set、Map
入参同上
超时、测速
Promise.race([
new Promise(resolve => setTimeout(resolve, 1, 'Timeout')),
fetch('/')
]).then(res => console.log(res)) // Timeout,1 毫秒会超时的 fetch 请求
入参同上
[{status: 'fulfilled', value: '终值'}, {status: 'rejected', reason: '拒绝原因'}...]
,自身到完成态then
等同于调用 Promise.prototype.then(undefined, onRejected)
,以下写法等价:
new Promise(()=>{
throw new Error('error')
}).catch(e => console.log(e)) // error
new Promise(()=>{
throw new Error('error')
}).then(undefined, e => console.log(e)) // error
new Promise((_, reject)=>{
try {
throw new Error('error')
} catch (e) {
reject(e)
}
}).catch(e => console.log(e)) // error
new Promise((_, reject)=>{
reject(new Error('error'))
}).then(undefined, e => console.log(e)) // error
优先使用 Promise.prototype.catch
而不是 Promise.prototype.then(undefined, onRejected)
处理错误
拒绝或报错时,就近找后 then
的 reject
回调或 catch
new Promise((_, reject)=>{
reject(new Error('error'))
}).then(() => console.log('no output'))
.catch(e => console.log(e)).catch(e => console.log('no output')) // error
无入参,Promise 实例转入完成态或拒绝态,都会执行