【问题标题】:Access Arg from Previous Function in Composed Function (using Rambda.pipe)在 Compose 函数中从前一个函数访问 Args(使用 Ramda.pipe)
【发布时间】:2020-06-06 05:50:07
【问题描述】:

我有一个案例,我有一个可以很好地组合在一起的管道,但是在一个实例中,我需要对我无法控制的 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 作为arg,而不是从callExternalApi 返回的结果。我对此有点陌生,所以我不确定我是否在正确的轨道上。

提前感谢您的帮助!

【问题讨论】:

  • 你可能想看看R.tap,它被设计为运行一个函数来处理它的副作用,但返回它收到的输入值。听起来这就是你所需要的。 (因此,您可以在管道中将 callExternalApi 替换为 tap(callExternalApi)。)但如果您正在处理异步调用,则可能需要将 pipe 替换为 pipeWith(andThen)
  • 是的,这正是我所需要的。谢谢!

标签: javascript functional-programming ramda.js


【解决方案1】:

我也是 ramda 的新手,这就是为什么我不确定答案的准确性,但doSomethingElseWithUserId 可以从getRecordFromDatabasecallExternalApi 接收user_id

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();

【讨论】:

  • 嗯,我的问题是我无法控制 doApiCall 函数。但是,我认为您在这里有所作为...我想我可以围绕doApiCall 创建一个包装器...类似于:const wrappedApiCall = async ( userId ) => { await callExternalApi( userId ); return userId; } 然后在我的管道中使用wrappedApiCall。并且错误仍然会冒泡并被handleAPIFailure 捕获,就像以前一样。
  • codesandbox.io/s/hopeful-ganguly-6zn67 你是对的!你可以用 try/catch 或 R.tryCatch 包裹await callExternalApi(userId);
猜你喜欢
  • 2023-03-19
  • 2017-11-23
  • 2017-11-04
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多