代码之家  ›  专栏  ›  技术社区  ›  jackdbd

在fetch中使用fluture`encasep`时unhandledpromiserejectionwarning`

  •  1
  • jackdbd  · 技术社区  · 7 年前

    我刚开始使用 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 回复  |  直到 7 年前
        1
  •  1
  •   Avaq    7 年前

    这里似乎发生了两件事:

    1. 这个 data.json() 函数不应包装在内部 tryP 因为根据你的第二个 不破 例如,它同步返回(没有 await )。这将导致fluture引发一个typeerror(因为它期望看到一个承诺,但得到一个json值)。尽管知道fetch API, JSON()数据 典型地 返回一个承诺,所以它也可能是你的第二个例子被打破了,而其他事情正在发生。不管是什么,我怀疑某个地方发生了意外错误。除了你发布的错误消息之外,你在控制台中还看到其他错误消息吗?
    2. 我做了一些测试,似乎是真的-当fluture在成功后引发或捕获类型错误时 encaseP 似乎最初的承诺设法捕捉到了那个错误,并触发了未经处理的拒绝。这似乎是一个在fluture回归错误,我将很快修复它。同时,如果我们深入到抛出错误的底部,您将能够继续而不依赖于所说的修复。

    编辑:我打开了一个公关来解决第二个问题: https://github.com/fluture-js/Fluture/pull/310

    edit2:修复程序已根据版本10.3.1发布。使用该版本可以让您更深入地了解问题所在 1 .

    推荐文章