Promise
Promise.resolve() 创建一个成功或失败
Promise.resolve('s'); Promise.resolve(new Promise((resolve, reject) => reject()));
|
Promise.reject() 创建一个失败
Promise.reject('错误').then(null, reason => console.log(reason))
|
Promise.all() 所有都成功,或者有一个失败
Promise.all([Promise.resolve(1), Promise.resolve(2), Promise.resolve(3)]) .then(values => console.log(values)) Promise.all([Promise.resolve(1), Promise.reject(2), Promise.reject(3)]) .then(null, reason => console.log(reason))
|
Promise.race() 返回第一个改变状态的结果
Promise.race([Promise.resolve(1), Promise.resolve(2)]) .then(values => console.log(values)) Promise.race([Promise.reject(1), Promise.resolve(2)]) .then(null, reason => console.log(reason))
|
Promise.allSettled() 返回所有的结果
Promise.allSettled([Promise.reject(1), Promise.resolve(2), Promise.resolve(3)]).then(values => console.log(values))
|
用 Promise.all() 模拟 allSettled
const allSettled = promise => promise.then( fulfilled => ({status: 'fulfilled', value: fulfilled}), rejected => ({status: 'rejected', value: rejected}) ) Promise.all([ allSettled(Promise.reject(1)), allSettled(Promise.resolve(2)), allSettled(Promise.reject(3)) ]).then(values => console.log(values))
const allSettled = promiseList => Promise.all(promiseList.map( promise => promise.then( fulfilled => ({status: 'fulfilled', value: fulfilled}), rejected => ({status: 'rejected', value: rejected}) ) )) allSettled([Promise.reject(1), Promise.resolve(2), Promise.reject(3)]) .then(values => console.log(values))
|
链式调用
Promise.resolve('hello').then(res => Promise.resolve(`${res}, world`)).then(res => console.log(res))
|
错误处理
Promise.reject('hello').then(res => console.log(`success:${res}`)).catch(res => console.log(`error:${res}`))
Promise.reject('hello').then(res => console.log(`success:${res}`)).then(null, res => console.log(`error:${res}`))
Promise.reject('hello').then(null, res => console.log(`error:${res}`))
|
async
await 只能在 async 函数里使用,async 函数会返回一个 Promise
function fn () { return new Promise(resolve => { resolve('hi') }) } async function fn2 () { let result = await fn() console.log(result) }
|
try catch 捕获异常
function ajax () { return new Promise((resolve, reject) => { reject('出错了') }) } async function fn () { try { let result = await ajax() console.log(result) } catch (error) { console.log(`error:${error}`) } } fn()
|
使用 catch 捕获异常
function ajax () { return new Promise((resolve, reject) => { reject('出错了') }) } async function fn () { let result = await ajax().catch(error => console.log(`error:${error}`)) console.log(result) } fn()
|
await 会使等号左边的代码变成异步
function fn2 () { console.log('fn2:同步1') Promise.resolve('Promise').then(result => console.log(result)) console.log('fn2:同步2') } async function fn () { console.log('同步') let result = await fn2() console.log('异步') } fn()
|
简单实现 Promise
class Promise { success = [] error = [] resolve = (data) => { setTimeout(() => { for (let i = 0; i < this.success.length; i++) { this.success[i](data); } }) } reject = (data) => { setTimeout(() => { for (let i = 0; i < this.error.length; i++) { this.error[i](data); } }) } constructor(fn) { fn(this.resolve, this.reject) } then(success, error) { this.success.push(success) error && this.error.push(error) return this } }
let p1 = new Promise2((resolve, reject) => { resolve('success') }) p1.then((res) => { console.log(res); }).then((res) => { console.log(res); })
|