UnhandledPromiseRejectionWarning при использовании Fluture `encaseP` в`fetch`

Я только начал использовать Flutures, и я пытаюсь получить некоторые удаленные данные для визуализации с помощью d3.

Я создал функцию, которая принимает селектор DOM (например, #my-chart) и URL (например, https://example.com/data.json).

Если при получении данных возникает ошибка, у меня есть унарная функция, которая показывает сообщение об ошибке. Если все идет хорошо, у меня есть унарная функция, которая рисует визуализацию. Для простоты предположим, что эти функции просто console.error а также console.log,

const fn = async (selector, url) => {
// convert fetch (which returns a Promise) into a function that 
returns a Future
const fetchf = Future.encaseP(fetch);

fetchf(url)
  .chain(res => Future.tryP(_ => res.json()))
  .fork(console.error, console.log);
}

Видимо я что-то упускаю при упаковке fetch в будущем, потому что я получаю это предупреждение:

UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().

Если бы мне пришлось использовать async/await Я написал бы что-то вроде этого, что не дало бы мне никакого предупреждения.

const fn = async (selector, url) => {
  let res;
  try {
    res = await fetch(url);
  } catch (err) {
    console.error(err);
    return;
  }
  let data;
  try {
    data = res.json();
  } catch (err) {
    console.error(err);
    return;
  }
  console.log(data);
};

1 ответ

Решение

Кажется, здесь происходят две вещи:

  1. data.json() функция не должна быть внутри tryP потому что, согласно вашему второму не разбитому примеру, он возвращается синхронно (нет await). Это приведет к тому, что Fluture вызовет TypeError (потому что он ожидает увидеть Promise, но получает значение JSON). Хотя, зная API выборки, data.json() обычно возвращает Обещание, так что, возможно, ваш второй пример не работает и что-то еще происходит. Что бы это ни было, я подозреваю, что где-то выдается неожиданная Ошибка. Видите ли вы какие-либо другие сообщения об ошибках в вашей консоли, кроме того, который вы опубликовали?
  2. Я провел некоторое тестирование, и это похоже на правду - когда Fluture вызывает успешную ошибку TypeError после успешного завершения encaseP Похоже, оригинальному Promise удается поймать эту ошибку и вызвать необработанное отклонение. Это похоже на ошибку регрессии в Fluture, и я скоро исправлю ее. В то же время, если мы дойдем до сути того, что выдает ошибку, вы сможете продолжить, не зависимо от указанного исправления.

РЕДАКТИРОВАТЬ: я открыл PR, чтобы исправить второй вопрос: https://github.com/fluture-js/Fluture/pull/310

EDIT2: исправление было выпущено в версии 10.3.1. Использование этой версии должно дать вам больше понимания того, что происходит с проблемой 1,

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