Accedi ad Arg dalla funzione precedente nella funzione composta (usando Rambda.pipe)

2020-02-22 javascript functional-programming ramda.js

Ho un caso in cui ho una pipeline che si adatta bene, ma c'è un'istanza in cui ho bisogno di lanciare una chiamata asincrona a un'API che non controllo. Non mi interessa necessariamente il risultato, solo se ha successo o meno, e quindi vorrei continuare a passare l' arg a quella chiamata (non il valore restituito). Quindi la mia pipeline è simile a questa:

const extractUserIdFromResponse = R.andThen( R.prop( user_id ) );
const callExternalApi = tryCatch(
   doApiCall, 
   handleAPIFailure
); 

const pipeline  = R.pipe(
   getRecordFromDatabase, 
   extractUserIdFromResponse, 
   callExternalApi, 
   doSomethingElseWithUserId 
); 

Fondamentalmente, voglio che la funzione doSomethingElseWithUserId accetti, ovviamente, l' userId come arg in contrapposizione al risultato restituito da callExternalApi . Sono un po 'nuovo in questo, quindi non sono sicuro di essere sulla strada giusta qui o no.

Grazie in anticipo per il vostro aiuto!

Answers

Sono anche una novità per Ramda, è per questo che non sono sicuro circa l'esattezza della risposta, ma doSomethingElseWithUserId può ricevere user_id da getRecordFromDatabase attraverso callExternalApi .

https://codesandbox.io/s/affectionate-oskar-kzn8d

import R from "ramda";

const getRecordFromDatabase = () => (
  new Promise((resolve, reject) => {
    return resolve({ user_id: 42 });
  })
);

// I assume that you need to pass the arg here in handleAPIFailure as well
const handleAPIFailure = () => {};
const doApiCall = args => (
  new Promise((resolve, reject) => {
    return resolve(args);
  })
);

const extractUserIdFromResponse = R.andThen(R.prop("user_id"));
const callExternalApi = R.tryCatch(doApiCall, handleAPIFailure);

const doSomethingElseWithUserId = user_id => {
  console.log(user_id); // 42
};

const pipeline = R.pipe(
  getRecordFromDatabase,
  extractUserIdFromResponse,
  callExternalApi,
  R.andThen(doSomethingElseWithUserId)
);

pipeline();

Related