首页 > 解决方案 > 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**传递给函数体。

标签: javascripttypescript

解决方案


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)

推荐阅读