Sanctuary js 执行 pipe with condition 的 2 步

Sanctuary js execute 2 steps of pipe with condition

我有一个 S.pipe 用于上传和操作传入的请求文件

S.pipe([
    getRequestFile,
    S.chain(saveTemporary),
    S.chain(checkIfIsImage),
    S.chain(addWatermarkToImage),   // only execute on image
    S.chain(copyImageToPublicPath), // only execute on image
    S.chain(copyFileToPath),
    S.chain(formatResponse),
]);

有 2 个特定步骤 addWatermarkToImagecopyImageToPublicPath 应该只对图像文件执行。

我知道我可以从 checkIfIsImage return Left 如果文件不是图像,但这样做 copyFileToPathformatResponse 也会被忽略.

如果文件不是图像,我只想忽略 addWatermarkToImagecopyImageToPublicPath

我该怎么做?

一般的做法是使用x => p (x) ? f (x) : g (x)这样的函数。 g 可以是一个微不足道的函数,例如 S.IS.Right.

在您的情况下,代码将类似于以下内容:

S.pipe ([
  getRequestFile,
  S.chain (saveTemporary),
  S.chain (file => file.type === 'image' ?
                   S.chain (copyImageToPublicPath)
                           (addWatermarkToImage (file)) :
                   S.Right (file)),
  S.chain (copyFileToPath),
  S.chain (formatResponse),
])

请注意,在非图像情况下,有必要 return S.Right (file) 而不是 file