Выполнить задание Fluture в середине трубы Sanctuary
У меня трубка такая:
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
в середине этой трубы?
1 ответ
Дело в том, чтобы выровнять типы.
Давайте составим несколько определений типов для использования в примере:
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)
]);
Для работы на 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)
Мы могли бы использовать S.chain
чтобы избежать этого вложения:
fut :: Future Error String
quux :: String -> Future Error Number
S.chain (quux) (fut) :: Future Error Number
Может быть полезно подумать о S.map
добавление к некоторым вычислениям операции, которая не может потерпеть неудачу, тогда как S.chain
добавляет вычисление, которое может дать сбой.