promise 状态
pending: 初始状态
fulfilled: 操作成功完成
rejected: 操作失败
settled: 完成(成功或失败)
组合函数
基元函数: Promise.resolve() , Promise.reject(), Promise.finally()
组合函数:Promise.all(), Promise.race(), Promise.allSettled()
Promise.all()
Promise.all(promises:Iterable<Promise>): Promise<Array>
-
其工作原理如下,全部运行成功,则返回成功数据组成的数组,任意一个promise失败,就会停止请求,并返回该错误:
使用场景:
并行处理耗时的处理,缩短处理时间:
const urls = [
'http://xxxx.com/user',
'http://xxxx.com/config',
]
result = await Promise.all(urls.map( url => get(url))) // 成功运行后result 为每个promise运行返回数据组成的数组
Promise.race()
Promise.race(promises:Iterable<peomise>): Promise
-
其工作原理如下:
使用场景
解决网络超时,将网络请求和定时器进行比较,请求时间大于定时器的时间,将会报错:
interface TimeoutResponse {
timeout: Nodejs.Timeout,
pending: Promise<void>
}
function createTimeout(duration: number): TimeoutResponse[] {
let timeout
const pending: Promise<void> = new Promise((__, reject) => {
timeout = setTimeout((): void => {
reject(new TimeoutError())
}, duration)
})
return [timeout, pending]
}
class TimeoutError extends Error {
constructor(message = 'Operation timeout'){
super(message)
this.message = message
this.name = 'TimeoutError'
}
}
try{
[timeout, pending] = createTimeout(5000),
await Promise.race([httpRequest, pending])
} catch (err) {
if(err instanceof TimeoutError) {
///xxxxx
}
} finally {
clearTimeout(timeout)
}
Promise.allSettled()
Promise.allSettled(promises:Iterable<Promise>): Promise<Array<settlementObject>>
-
其工作原理如下,Promise.allSettled跟Promise.all类似, 其参数接受一个Promise的数组, 返回一个新的Promise, 唯一的不同在于, 其不会进行短路, 也就是说当Promise全部处理完成后我们可以拿到每个Promise的状态, 而不管其是否处理成功.
应用场景
并行处理:
// sample 1
Promise.allSettled([
Promise.resolve('a'),
Promise.reject('b'),
])
.then(arr => assert.deepEqual(arr, [
{ status: 'fulfilled', value: 'a' },
{ status: 'rejected', reason: 'b' },
]));
// sample 2
const urls = [
'http://xxxx.com/user',
'http://xxxx.com/config',
]
result = await Promise.allSettled(urls.map( url => get(url))) // 、运行后result 为每个promise运行返回数据组成的数组,无论成功失败