Подтвердить что ты не робот

Обработка асинхронного программирования с помощью Ramda

Я рассматриваю функции обработки, которые возвращают promises с функциями Ramda, отличными от pipeP. Я пытаюсь сравнить функции (одна из которых возвращает обещание) с такими же значениями:

getSectionFromDb :: obj -> promise
getSectionFromData :: obj -> number

R.equals(
    getSectionFromDb,
    getSectionFromData
)

Здесь есть два фактора. Сначала R.equals не будет оценивать функции, но большая проблема заключается в том, что я сравниваю обещание с числом.

Есть ли функциональный способ делать такие вещи (я знаю, что функции не являются ссылочными, но должен быть способ общения с io)? Есть ли способ Рамды сделать это?

Спасибо.

4b9b3361

Ответ 1

Вы можете использовать Promise.resolve для "обертывания" значения в обещании.

getSectionFromDataPromise :: obj -> promise
getSectionFromDataPromise = R.pipe(getSectionFromData , (val) => Promise.resolve(val))

Таким образом, вы можете продвигать (поднимать) любую функцию, которая возвращает нормальное значение тому, которое возвращает обещание.

Подъем является важной концепцией в FP. Вы можете просмотреть Array.map как функцию, которая поднимает функцию, которая преобразует значение в функцию, которая преобразует массив значений.

Вы можете использовать Promise.all для записи функции, которая сравнивает promises и (например), выдает ошибку, если они не равны.

function promiseEquals (f1, f2) {
  return Promise.all([f1(), f2()]).then(function(vals) {
    if(!R.equals(vals[0], vals[1])) {throw "The values aren't equal"}
    return vals[0]
  })
}

Наконец, вы можете объединить два:

promiseEquals(getSectionFromDataPromise, getSectionFromDb)
  .then(function(val){
    console.log(val)
  })
  .catch(function(val){console.log("Error "+val)})

Ответ 2

Я знаю, вопрос старый. Но у ramda есть некоторые классные функции для создания функций, возвращающих Promise: pipeP и composeP.

Также загляните в обычный compose (pipe) и реализация Kleisli composeK (pipeK). Они позволяют работать с алгебраическими структурами, такими как Future или Task, которые выглядят так же, как Promise, но лениво оцениваются.