moh*_*emi 1 javascript functional-programming sanctuary 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
]);
Run Code Online (Sandbox Code Playgroud)
在这个管道中间有 2 个异步函数。我要awaitforcopyImageToPublicPath然后awaitforcopyFileToPath然后继续正常流程
经过一番搜索,我发现有Future.tryP功能可以做,async但是我如何Fluture在这个管道中间使用?
这是排列类型的问题。
让我们组成一些类型定义以在示例中使用:
foo :: String -> String
bar :: String -> Future Error String
baz :: String -> Array String
Run Code Online (Sandbox Code Playgroud)
现在,让我们一步一步地创建我们的程序……
// program :: a -> a
const program = S.pipe ([
]);
Run Code Online (Sandbox Code Playgroud)
// program :: String -> String
const program = S.pipe ([
foo, // :: String
]);
Run Code Online (Sandbox Code Playgroud)
// program :: String -> Future Error String
const program = S.pipe ([
foo, // :: String
bar, // :: Future Error String
]);
Run Code Online (Sandbox Code Playgroud)
// program :: String -> Future Error (Array String)
const program = S.pipe ([
foo, // :: String
bar, // :: Future Error String
S.map (baz), // :: Future Error (Array String)
]);
Run Code Online (Sandbox Code Playgroud)
要对b内部的Future a 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)
Run Code Online (Sandbox Code Playgroud)
我们可以S.chain用来避免这种嵌套:
fut :: Future Error String
quux :: String -> Future Error Number
S.chain (quux) (fut) :: Future Error Number
Run Code Online (Sandbox Code Playgroud)
考虑S.map将不会失败的操作添加到某些计算中,而S.chain添加可能失败的计算可能会有所帮助。
| 归档时间: |
|
| 查看次数: |
241 次 |
| 最近记录: |