Получите доступ к Arg из предыдущей функции в составной функции (используя Rambda.pipe) - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть случай, когда у меня есть конвейер, который хорошо сочетается, но есть случай, когда мне нужно запустить асинхронный c вызов API, который я не контролирую. Мне не обязательно заботиться о результате, просто о том, успешен он или нет, и затем хотел бы продолжить передачу arg на этот вызов (не возвращаемое значение). Таким образом, мой конвейер выглядит примерно так:

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

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

По сути, я хочу, чтобы функция doSomethingElseWithUserId, очевидно, принимала userId в качестве аргумента, а не результат, возвращаемый из callExternalApi. Я немного новичок в этом, поэтому я не уверен, нахожусь ли я на правильном пути здесь или нет.

Заранее спасибо за помощь!

1 Ответ

1 голос
/ 21 февраля 2020

Я тоже новичок в ramda, поэтому не уверен насчет точности ответа, но doSomethingElseWithUserId может получить user_id от getRecordFromDatabase до 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();
...