我有一个这样的烟斗:
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
]);在此管道的中间有两个异步函数。我希望对copyImageToPublicPath使用await,然后对copyFileToPath使用await,然后继续正常流程
经过一些搜索,我发现有用于执行async的Future.tryP函数,但是如何在此管道中间使用Fluture?
发布于 2019-11-05 02:30:57
这是一个排列类型的问题。
让我们构造一些类型定义,以便在示例中使用:
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, // :: String
bar, // :: Future Error String
S.map (baz), // :: Future Error (Array String)
]);要对Future a b值中的b进行操作,我们可以使用S.map或S.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://stackoverflow.com/questions/58697289
复制相似问题