UnhandledPromiseRejectionWarning при использовании Fluture `encaseP` в` fetch` - PullRequest
0 голосов
/ 16 января 2019

Я только что начал использовать 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 в Future, потому что я получаю это предупреждение:

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

0 голосов
/ 20 января 2019

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

  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.

...