1

我有这样的管道:

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 个异步函数。我想awaitforcopyImageToPublicPath然后awaitforcopyFileToPath然后继续正常流程

经过一番搜索,我发现有Future.tryP功能可以做async,但我如何Fluture在这个管道中间使用?

4

1 回答 1

9

这是排列类型的问题。

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

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

现在,让我们一步一步地创建我们的程序……</p>

//    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)
]);

要对b内部Future a b值进行操作,我们使用S.mapor 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添加一个可能失败的计算可能会有所帮助。

于 2019-11-04T18:30:56.547 回答