2

我有一个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只应针对图像文件执行。

我知道如果文件不是图像,我可以返回Left,但这样做也会被忽略。checkIfIsImagecopyFileToPathformatResponse

如果文件不是图像addWatermarkToImage,我想忽略copyImageToPublicPath

我怎样才能做到这一点?

4

1 回答 1

2

一般的方法是使用一个函数,例如x => p (x) ? f (x) : g (x). g可以是一个微不足道的函数,例如S.Ior S.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),
])

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

于 2019-11-04T15:28:57.927 回答