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 ответ
Кажется, здесь происходят две вещи:
-
data.json()
функция не должна быть внутриtryP
потому что, согласно вашему второму не разбитому примеру, он возвращается синхронно (нетawait
). Это приведет к тому, что Fluture вызовет TypeError (потому что он ожидает увидеть Promise, но получает значение JSON). Хотя, зная API выборки,data.json()
обычно возвращает Обещание, так что, возможно, ваш второй пример не работает и что-то еще происходит. Что бы это ни было, я подозреваю, что где-то выдается неожиданная Ошибка. Видите ли вы какие-либо другие сообщения об ошибках в вашей консоли, кроме того, который вы опубликовали? - Я провел некоторое тестирование, и это похоже на правду - когда Fluture вызывает успешную ошибку TypeError после успешного завершения
encaseP
Похоже, оригинальному Promise удается поймать эту ошибку и вызвать необработанное отклонение. Это похоже на ошибку регрессии в Fluture, и я скоро исправлю ее. В то же время, если мы дойдем до сути того, что выдает ошибку, вы сможете продолжить, не зависимо от указанного исправления.
РЕДАКТИРОВАТЬ: я открыл PR, чтобы исправить второй вопрос: https://github.com/fluture-js/Fluture/pull/310
EDIT2: исправление было выпущено в версии 10.3.1. Использование этой версии должно дать вам больше понимания того, что происходит с проблемой 1
,