Fluture: преобразование будущего в обещание для экспресс-обработки глобальных ошибок

Я пытаюсь найти способ преобразовать обещание в будущее, используя библиотеку fluture для реализации функционального программирования, преобразования данных с помощью функционального конвейера, а затем обратного преобразования в обещание, чтобы я мог использовать функции ожидания/асинхронности. Это для экспресс-приложения, и я использую глобальную обработку ошибок, и я не вижу, как воспользоваться преимуществами глобальной обработки ошибок для конечных точек, если я поймаю ошибки в будущем потоке процесса без преобразования в обещание после завершения будущей обработки.

  1. Я прав, думая таким образом?
  2. Если да, то как я могу использовать утилиту обещания в приведенном ниже коде для перевода обратно в обещание после вызова encaseP и последующего кода конвейера?
  3. Есть ли лучший способ использовать будущий конвейер, при этом получая ошибки в глобальный обработчик ошибок?
  4. Кроме того, если я перейду к обещанию, даст ли это мне доступ к фактическому значению в будущем, если я использую ожидание, я так полагаю?

Извините, если это плохой вопрос, я новичок в функциональном программировании и флуоресценции и пытаюсь правильно настроить свои утки.

      const arrayList = [];
arrayList.push({
    a: {
        b: 1,
        c: 2,
        d: 3
    }
},{
    a: {
        b: 2,
        c: 3,
        d: 3
    }
})

const findData = (arrayList) => Promise.reject(null)

let total1 = (list) => encaseP(findData)(list)
    .pipe(res => res)
    .pipe(map(x => x.map(y => ({
        a: {
            b: y.a.b + 1,
            c: y.a.c + 1,
            d: y.a.d + 1
        }
    }))))
    .pipe(promise (() => {console.log('do nothing')}) (console.log));


console.log(total1);
total1(arrayList);

Когда я запускаю код выше, я получаю следующую ошибку:

внутренний/модули/cjs/loader.js:992internalBinding('ошибки').triggerUncaughtException(^

TypeError: promise() ожидает, что его первый аргумент будет действительным Future.

1 ответ

Я считаю, что достаточно ответил на этот вопрос в Gitter . Я подытожу свой ответ ниже для дальнейшего использования.


В вашем коде я вижу несколько вещей, на которые я хотел бы обратить внимание:

  1. : рекомендую уже тут же обмотать encaseP- как можно раньше. Таким образом, вы получите (arrayList) => encaseP (Promise.reject) (arrayList), что также можно записать как encaseP (Promise.reject)(потому что входной аргумент просто передается как есть).
  2. Теперь функция может вызывать findDataнапрямую и вернуть будущее.
  3. .pipe (res => res): Эта строка на самом деле ничего не делает. Здесь вы преобразуете res, который является Future массива, в res, что в точности то же самое. Важно понимать, что канал — это просто функциональное приложение: /questions/53146452/sozdanie-funktsii-composepipe-dlya-futures-iz-fluture/53146457#53146457
  4. .pipe (promise (() => {console.log('do nothing')}) (console.log)): Когда вы потребляете Future, работа фактически начинается, и потребление возвращает функцию отмены (или Promise, в случае promise (future)). Вы должны делать это не внутри своих функций, а вне их. Рекомендую прочитать введение во Fluture, особенно часть про «не потреблять фьючерсы» . Руководящим правилом является то, что вы должны видеть (или promiseили любую другую функцию потребления), вызываемую на самом «крае» вашей программы. Это тот момент, когда вы уже не можете передать Будущее дальше той стороне, которая его поймет.

После удаления этой последней строки из функции, чтобы Future не потреблялся, а возвращался из функции, мы можем использовать Future там, где это необходимо. Например, промежуточное ПО Express, которое запускает total1функция и перенаправляет ее вывод в ответ, будет выглядеть примерно так:

      app.get ('/total', (req, res, next) => {
  total1 (req.query.arrayList)
  .pipe (fork (next) (result => res.json ({result})))
})

Прохождение nextв качестве обратного вызова отказа forkзаставляет Express обрабатывать ошибку. Это необходимо для каждого экспресс-маршрута, внутри которого вы хотите использовать Future для управления асинхронностью. Вы можете использовать fluture-express , чтобы убрать часть этого шаблона.

Другие вопросы по тегам