我有这个现有功能:

  const inferProcessingError = R.ifElse(
    R.propEq('conversionJobStatus', 3),
    R.always('Last Process failed with error; please contact DevOps'),
    R.always(null)
  );


像这样被称为:

const msg = inferProcessingError(jobStruct || {});


与此工作结构:

{"id":9,"mediaGroupId":1000000,"conversionJobStatus":3,
  "errorDetails": {
     "Cause": {
        "errorMessage": "MediaConvert Job Failed with ERROR status: ERROR Video codec [indeo4] is not a supported input video codec",
     },
     "Error": "Error",
   }
}


并且我需要创建一个错误消息字符串,其中包含来自Cause.errorMessage元素的数据。

使用本机JavaScript函数,这简直太简单了,但是我正在学习Ramda,并且只想修改现有代码以包含在错误消息中。

R.prop('Cause')['errorMessage']可以工作,除了我无法弄清楚如何引用传递给inferProcessingError语句的jobStruct。

我可以看到R.ifElse和后续的Ramda函数能够获取该引用,但是当我在错误消息字符串中嵌入R.prop('Cause')时,它将解析为一个函数,而不是Cause元素的值,因为似乎正在等待数据结构。

那么...我如何获得对jobStruct参考的访问? (此处未定义arguments)。

更新:
我可以通过引用R.Prop('ErrorDetails', jobStruct)['Cause']['errorMessage']中的原始jobStruct来使其工作,但这对我来说似乎有点笨拙……

但是,如果对inferProcessingError的调用实际上是在map语句内,并且引用了较大结构的元素,则映射索引不可用于引用R.prop的数据结构。

最佳答案

也许您可以使用pipepath方法来实现这种“ ramda方式”。

首先使用ramda的path()函数从输入的errorMessage对象中提取嵌套的jobStruct值。接下来,将其包含在pipe()中,该concat会将提取的消息转换为使用自定义错误前缀格式化的字符串:

const incCount = R.ifElse(
    R.propEq('conversionJobStatus', 3),

    /* Evaluate this pipe if the error case is satisfied */
    R.pipe(
        /* Path to extract message from input object */
        R.path(["errorDetails", "Cause", "errorMessage"]),
        /* Prefix string to extracted error message */
        R.concat('Custom error prefix:')),

    R.always('')
);

incCount({"id":9,"mediaGroupId":1000000,"conversionJobStatus":3,
  "errorDetails": {
     "Cause": {
        "errorMessage": "MediaConvert Job Failed with ERROR etc etc",
     },
     "Error": "Error",
   }
});


这是working example-希望对您有所帮助!

更新资料

感谢@customcommander的建议使用作为字符串前缀,并为第二个分支返回空字符串值

09-17 23:10