在保护区管道的中间执行Fluture任务

我有一个这样的管道:

S.pipe([
    getRequestFile,// not async
    S.chain(saveTemporary),// not async
    S.chain(copyImageToPublicPath),// async
    S.chain(copyFileToPath),// async
    S.chain(someLoggingFunction),// not async
    S.chain(sendResponse),// not async
]);

此管道中间有2个异步函数。 我想为await copyImageToPublicPath,然后为await copyFileToPath,然后继续正常流程

经过一番搜索,我发现有Future.tryP个函数可以用来做async,但是如何在此管道的中间使用Fluture

linlaiku 回答:在保护区管道的中间执行Fluture任务

这是排列类型的问题。

让我们组成一些类型定义以供示例使用:

foo :: String -> String
bar :: String -> Future Error String
baz :: String -> Array String

现在,让我们逐步创建程序...

//    program :: a -> a
const program = S.pipe ([
]);
//    program :: String -> String
const program = S.pipe ([
  foo,// :: String
]);
//    program :: String -> Future Error String
const program = S.pipe ([
  foo,// :: String
  bar,// :: Future Error String
]);
//    program :: String -> Future Error (Array String)
const program = S.pipe ([
  foo,// :: Future Error String
  S.map (baz),// :: Future Error (Array String)
]);

要在b值内对Future a b进行操作,我们可以使用S.mapS.chain

S.map可能导致不必要的嵌套:

fut :: Future Error String

quux :: String -> Future Error Number

S.map (quux) (fut) :: Future Error (Future Error Number)

我们可以使用S.chain来避免这种嵌套:

fut :: Future Error String

quux :: String -> Future Error Number

S.chain (quux) (fut) :: Future Error Number

考虑将S.map添加到某个计算中不会失败的操作会有所帮助,而S.chain添加一个可能会失败的计算。

本文链接:https://www.f2er.com/3165301.html

大家都在问