javascript - lambda 函数参数如何传递给函数体
问题描述
我是javacscript和typescript的新手,我在网上找到了一些代码,我不明白,你能解释一下。
谢谢
原代码 https://www.learnrxjs.io/learn-rxjs/operators/error_handling/retrywhen
export const genericRetryStrategy = ({
maxRetryAttempts = 3,
scalingDuration = 1000,
excludedStatusCodes = []
}: {
maxRetryAttempts?: number,
scalingDuration?: number,
excludedStatusCodes?: number[]
} = {}) => (attempts: Observable<any>) => {
return attempts.pipe(
mergeMap((error, i) => {
const retryAttempt = i + 1;
// if maximum number of retries have been met
// or response is a status code we don't wish to retry, throw error
if (
retryAttempt > maxRetryAttempts ||
excludedStatusCodes.find(e => e === error.status)
) {
return throwError(error);
}
console.log(
`Attempt ${retryAttempt}: retrying in ${retryAttempt *
scalingDuration}ms`
);
// retry after 1s, 2s, etc...
return timer(retryAttempt * scalingDuration);
}),
finalize(() => console.log('We are done!'))
);
};
第一个问题,这段代码是如何工作的
export const genericRetryStrategy = ({
maxRetryAttempts = 3,
scalingDuration = 1000,
excludedStatusCodes = []
}: {
maxRetryAttempts?: number,
scalingDuration?: number,
excludedStatusCodes?: number[]
} = {})
第二个问题,**=> (attempts: Observable<any>)** =>
在上面的代码和函数体之间,如何**maxRetryAttempts**
传递给函数体。
解决方案
export const genericRetryStrategy = ({
maxRetryAttempts = 3,
scalingDuration = 1000,
excludedStatusCodes = []
}: {
maxRetryAttempts?: number,
scalingDuration?: number,
excludedStatusCodes?: number[]
} = {})
这声明了一个接受一个参数的函数。第 5 行之后的那部分:
将该对象类型为具有三个属性的对象,每个属性都可能被undefined
或省略(这就是?
意思)。
在第 2-4 行中,我们看到该对象已解构,因此每个属性都成为局部变量。此外,每个变量都有一个默认值(= 3
在变量名之后),以防该属性在参数对象上没有值。
最后一行为整个对象提供了一个默认值,这意味着您可以完全省略它。
现在对于这一行:
//...
} = {}) => (attempts: Observable<any>) => {
简而言之,这个函数返回一个函数。
一个更简单的例子:
你可以这样写:
const a = (x: number) => {
return (y: number) => x * y
}
const b = a(2)
b(3) // 6
const a = (x: number) => (y: number) => x * y
const b = a(2)
b(3) // 6
用简单的英语来说,a
是一个函数,它返回一个函数,它返回一个值。
在您问题中的代码的情况下,genericRetryStrategy
需要一个对象来配置操作将如何重试并返回一个函数。那个需要一个可观察对象来操作的函数,它根据你第一次调用的方式重新绑定genericRetryStrategy
所以总结一下:
export const genericRetryStrategy = ({
maxRetryAttempts = 3,
scalingDuration = 1000,
excludedStatusCodes = []
}: {
maxRetryAttempts?: number,
scalingDuration?: number,
excludedStatusCodes?: number[]
} = {}) => (attempts: Observable<any>) => {
//..
}
像这样调用:
const strategy = genericRetryStrategy({ maxRetryAttempts: 10 })
const doWithRetries = strategy(myObservable)
推荐阅读
- kubernetes - Kubectl 无法在 HPA 上描述
- python - 动态 SQL 查询 Psycopg2 值问题
- python - 如何在python中定义输入变量?
- angular - 如何在复杂对象的Angular *ngFor循环中获取异步条件属性
- c# - 为什么 Castle Windsor 拦截器会破坏 C# 动态对象上方法的运行时绑定?
- python - 在python中通过最小二乘法查找未知数
- xml - 在 XPath 中选择重复的标签 ID
- mysql - 无法将 R 连接到托管在 AWS 的 Bitnami 服务器中的 mysql
- c - 调用 dup/dup2 后关闭文件描述符的规则是什么?
- arrays - 垂直循环一个二维数组并从每一行中选择一个