我刚刚开始使用注量,我正在尝试获取一些远程数据,以便使用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);
};发布于 2019-01-20 15:13:50
这里似乎发生了两件事:
data.json()函数不应该包装在tryP中,因为根据第二个未中断的示例,它同步返回(没有await)。这将导致Fluture引发一个TypeError (因为它希望看到一个承诺,但得到一个JSON值)。尽管知道了fetch API,data.json()通常会返回一个承诺,所以这也可能是您的第二个示例失败了,而且还发生了其他事情。不管它是什么,我怀疑一个意想不到的错误正在某处抛出。在您的控制台中,除了您发布的错误消息之外,您还看到其他错误消息吗?encaseP时,最初的承诺似乎成功地捕捉到了这个错误,并触发了未处理的拒绝。这似乎是一个回归错误在Fluture,我将很快修复它。同时,如果我们找到了抛出错误的原因,您将可以继续,而不依赖于所述的修复。编辑:我打开了一个PR来修复第二个问题:https://github.com/fluture-js/Fluture/pull/310
EDIT2:修复已经在10.3.1版本下发布。使用该版本可以让您更深入地了解1问题的发生。
https://stackoverflow.com/questions/54207802
复制相似问题