lodash 已死?Radash 库方法介绍及源码解析 —— 异步方法篇
all:同时执行多个异步操作
使用说明
功能描述: 类似于
Promise.all
和Promise.allSettled
,等待一个由多个Promise
组成的对象或数组中的所有Promise
都完成(或者其中一个失败)。执行的所有错误和抛出的错误都会收集在AggregateError
中。参数:promise 对象/promise 数组
返回值:所有
promise
执行后的结果数组或对象
使用代码示例
源码解析
方法流程说明:
将输入的
promises
转换为一个统一格式的entries
数组,无论它是一个Promise
数组还是一个Promise
对象。对于每个
entry
,创建一个新的Promise
来处理成功和失败的情况,并使用Promise.all
等待所有这些新Promise
完成。如果所有
Promise
都成功解析,根据promises
是数组还是对象,返回一个包含所有结果的数组或对象。如果有一个或多个
Promise
失败,则抛出一个AggregateError
,其中包含所有失败的Promise
的异常。
defer:在异步流程中添加清理或错误处理逻辑
使用说明
功能描述:用来执行一个异步函数,同时提供注册回调的机制,在异步函数执行完成后执行特定回调操作。
参数:异步函数。
返回值:异步函数成功执行时,返回其响应结果,否则重新抛出错误。
使用代码示例
源码解析
方法流程说明:
定义一个
callbacks
数组来存储注册的回调函数及其选项。实现
register
函数,该函数允许func
注册回调函数和选项。调用外部提供的(但在代码片段中未定义)
tryit
函数执行func
,并传递register
函数给func
。等待
func
完成执行,获取可能的错误err
和响应response
。依次执行
callbacks
数组中的回调函数,处理可能的错误。如果任何一个回调函数中出现需要重新抛出的错误,并且其
rethrow
选项为true
,则重新抛出该错误。如果
func
执行时产生了错误,重新抛出该错误。如果
func
成功执行,返回其响应结果。
guard:执行一个函数,并提供错误处理的能力
使用说明
功能描述:
guard
函数可以用来为函数调用提供额外的错误处理逻辑,特别是当你希望根据错误类型选择性地处理错误时。参数:目标函数、指定错误对象得函数(可选)。
返回值:抛出原始或返回 undefined。
使用代码示例
源码解析
方法流程说明:
尝试执行
func
函数并捕获任何抛出的错误。如果
func
执行成功并返回一个Promise
,那么使用catch
方法捕获该Promise
可能抛出的错误,并应用_guard
函数。如果
func
执行成功并没有返回Promise
,那么直接返回结果。如果
func
抛出错误,应用_guard
函数来决定是否重新抛出错误或返回undefined
。如果提供了
shouldGuard
函数,它将用来判断是否应该 "guard"(捕获并返回undefined
)错误。如果shouldGuard
函数返回false
,则抛出原始错误;如果返回true
或未提供shouldGuard
函数,则返回undefined
。
map:对一个数组中的每个元素执行一个异步映射函数
使用说明
功能描述:它用于对一个数组中的每个元素执行一个异步映射函数,并返回一个包含所有映射结果的新数组。这个函数是
Array.prototype.map
方法的异步版本。参数:数组,异步函数。
返回值:映射后的新数组。
使用代码示例
源码解析
方法流程说明:
检查
array
是否存在。如果不存在,返回一个空数组。
初始化一个空数组
result
用于存储映射结果,以及一个索引计数器index
。遍历
array
中的每个元素。对于每个元素,调用异步映射函数asyncMapFunc
并等待Promise
解析。将异步映射函数解析后的结果添加到
result
数组中。在遍历完所有元素之后,返回包含所有映射结果的
result
数组。
parallel:并行地处理数组中的元素,并对每个元素执行一个异步函数
使用说明
功能描述:这个函数会限制同时进行的异步操作的数量,以避免同时启动过多的异步任务。
参数:限制数量(number)、需要被异步处理的元素数组、转换函数(将数组中的每个元素转换为一个异步操作)。
返回值:返回一个数组,该数组包含了按原数组顺序排序的所有成功的结果。
使用代码示例
源码解析
这段代码中使用了几个未定义的函数和类型,如
tryit
、list
、fork
和sort
,以及类型WorkItemResult<K>
。我们可以假设这些函数和类型具有以下功能:
tryit(func)(item)
:执行func(item)
并捕获任何抛出的错误,返回一个包含错误和结果的元组。list(1, limit)
:创建一个包含从 1 到limit
的数字的数组。fork(array, condition)
:分割数组array
,根据condition
函数返回的布尔值将数组分为包含错误的元素和成功的元素两个数组。sort(array, keySelector)
:根据keySelector
函数返回的键对数组array
进行排序。WorkItemResult<K>
:一个类型,表示工作项的结果,包含可能的error
、成功的result
以及元素的index
。
reduce:对数组中的每个元素执行一个异步归约函数
使用说明
功能描述:它是
Array.prototype.reduce
方法的异步版本,用于对数组中的每个元素执行一个异步归约函数,并返回最终的归约值。参数:被归约处理的元素数组、异步归约函数。
返回值:返回最终归约的值。
使用代码示例
源码解析
方法流程说明:
检查是否提供了初始值
initValue
。如果没有提供初始值且数组为空,则抛出错误,因为无法从空数组中归约出一个值。
确定迭代的数组。如果提供了初始值,则迭代整个数组;如果没有提供初始值,则从数组的第二个元素开始迭代。初始化累加值
value
。如果提供了初始值,则使用该初始值;如果没有提供初始值,则使用数组的第一个元素作为初始累加值。
遍历数组,对每个元素调用异步归约函数
asyncReducer
,并等待其返回的Promise
解析。更新累加值
value
为asyncReducer
返回的新值。在遍历完所有元素之后,返回最终的累加值。
retry:反复尝试执行一个异步操作,直到达到设置上限
使用说明
功能描述:用于反复尝试执行一个异步操作,直到成功或达到重试次数上限。如果操作失败,可以选择在重试之间设置延迟或使用退避函数(backoff)来计算延迟时间。
参数:条件对象 options(包含:重复次数、延迟、退避函数)、失败执行的异步操作函数。
返回值:可能发挥 undefined。
使用代码示例
源码解析
方法流程说明:
从
options
中获取重试次数、延迟和退避函数。遍历从 1 到重试次数的范围。
在每次迭代中,尝试执行
func
并捕获可能的错误和结果。如果
func
成功执行(没有错误),返回结果。如果有错误,并且是通过
exit
函数显式退出的,重新抛出原始错误。如果达到了重试次数上限并且仍然失败,抛出最后一次的错误。
如果指定了延迟或退避函数,根据相应的策略等待一段时间后再重试。
如果执行到函数的末尾,返回
undefined
作为占位符,因为逻辑上不应该到达这里。
sleep:提供一个延时机制
使用说明
功能描述:提供一个延时机制,通常用于异步操作中的暂停。
参数:暂停时间(ms)。
返回值:返回一个新的 Promise。
使用代码示例
源码解析
方法流程说明:当你调用
sleep
函数并传入一个毫秒数时,它会返回一个Promise
。这个Promise
不会立即解析,而是会等待你指定的时间长度。当时间到了之后,Promise
会被解析,然后你可以在.then()
方法中继续执行后续的代码,或者你可以在async
函数中使用await
关键字来等待Promise
解析。
tryit:捕获函数在执行过程中可能抛出的同步或异步错误
使用说明
功能描述:
tryit
是一个高阶函数。用于捕获函数在执行过程中可能抛出的同步或异步错误,并返回一个元组,其中包含错误对象或函数的返回值。这个函数的目的是提供一种安全执行任意函数并处理错误的方式。参数:需要被捕获的函数。
返回值:返回一个新函数,该函数接收与传入函数相同的参数。
使用代码示例
源码解析
方法流程说明:
tryit
函数接受一个函数func
作为参数。tryit
返回一个新函数,这个新函数接受与func
相同的参数。当调用这个新函数时,它尝试执行
func
。如果func
成功执行,且其返回值不是Promise
,新函数返回一个元组[undefined, result]
。如果
func
返回一个Promise
,新函数返回一个Promise
,该Promise
解析为元组[undefined, value]
或[err, undefined]
,具体取决于Promise
是成功解析还是被拒绝。如果在执行
func
时捕获到同步错误,新函数返回一个元组[err, undefined]
。如果func
的返回类型是Promise
,那么新函数的返回类型也是Promise
,否则返回类型就是元组。
文章转载自:雾散声声慢
评论