Выполнить задание Fluture в середине трубы Sanctuary - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть труба, подобная этой:

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 Ответ

3 голосов
/ 04 ноября 2019

Это вопрос выравнивания типов.

Давайте создадим некоторые определения типов для использования в примере:

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 добавляет вычисление, которое может завершиться неудачей.

...