Soy nuevo en javacscript y mecanografiado, encontré un código en línea, no lo entiendo, ¿puedes explicarlo?
Gracias
código original 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!')) ); };Primera pregunta, ¿cómo funciona este código?
export const genericRetryStrategy = ({ maxRetryAttempts = 3, scalingDuration = 1000, excludedStatusCodes = [] }: { maxRetryAttempts?: number, scalingDuration?: number, excludedStatusCodes?: number[] } = {}) segunda pregunta, hay **=> (attempts: Observable<any>)** => entre el código anterior y el cuerpo de la función, cómo se **maxRetryAttempts** al cuerpo de la función.
export const genericRetryStrategy = ({ maxRetryAttempts = 3, scalingDuration = 1000, excludedStatusCodes = [] }: { maxRetryAttempts?: number, scalingDuration?: number, excludedStatusCodes?: number[] } = {}) Esto declara una función que toma un argumento. Esa parte después de : en la línea 5 escribe ese objeto como un objeto con tres propiedades, cada una de las cuales puede no estar undefined u omitirse (eso es lo que significa ? ).
En las líneas 2-4 vemos que este objeto está desestructurado, de modo que cada propiedad se convierte en una variable local. Además, cada variable tiene un valor predeterminado (el = 3 después del nombre de la variable) en caso de que esa propiedad no tenga valor en el objeto de argumento.
La última línea proporciona un valor predeterminado para todo el objeto, lo que significa que puede omitirlo por completo.
Ahora para esta línea:
//... } = {}) => (attempts: Observable<any>) => {En resumen, esta función devuelve una función.
Un ejemplo más simple:
podrías escribir esto:
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 En lenguaje sencillo, a es una función que, devuelve una función, que devuelve un valor.
En el caso del código en su pregunta, genericRetryStrategy toma un objeto que configura cómo se reintentará la operación y devuelve una función. Esa función que toma un observable para operar, que se vincula de acuerdo con la forma en que llamó por primera vez a genericRetryStrategy
Así que para resumir:
export const genericRetryStrategy = ({ maxRetryAttempts = 3, scalingDuration = 1000, excludedStatusCodes = [] }: { maxRetryAttempts?: number, scalingDuration?: number, excludedStatusCodes?: number[] } = {}) => (attempts: Observable<any>) => { //.. }se llama así:
const strategy = genericRetryStrategy({ maxRetryAttempts: 10 }) const doWithRetries = strategy(myObservable)