0

我有以下代码

  let test =
    Js.Promise.resolve("Hello") |> Js.Promise.then_(_obj => raise(Not_found));
  let ker =
    switch test {
    | exception Not_found => Js.log("not found")
    | _ => Js.log("found")
    };

它产生的输出是:

"found"

为什么上面的代码不产生输出"not found",我应该怎么做才能确保 switch 语句中的第一个分支被执行?

4

2 回答 2

3

这主要与 JavaScript 处理在 Promise 中抛出的异常的方式有关。它们需要使用绑定到https://bucklescript.github.io/bucklescript/的https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch来处理api/Js.Promise.html#VALcatch,因为它们被“捕获”在 Promise 中并留在 Promise 上下文中。

具体来说,我会把你的例子变成这样:

let test = Js.Promise.(resolve("Hello") |> then_(_obj => raise(Not_found)));

let ker = Js.Promise.(test
  |> then_((_) => "found" |> Js.log |> resolve)
  |> catch((_) => "Not found" |> Js.log |> resolve));
于 2018-02-14T05:53:09.210 回答
2

因为承诺就是承诺,无论它是否失败。在您的情况下,在某些时候它将被解决为失败的承诺,但它永远不会引发/抛出错误。它只是一个承诺,其内在价值在某些时候会是一个错误(一个非抛出的错误)。

为了捕获错误(或值),您需要在绑定catch上使用该函数。testcatch函数处理被拒绝的承诺,该then函数对已履行的承诺做什么。

片段:

let handleData = [@bs.open] (
  fun
  | Invalid_argument(_) => Js.Promise.resolve(0)
  | Not_found => Js.Promise.resolve(1)
  | Sys_error(_) => Js.Promise.resolve(2)
  );  

let ker =
    test |> Js.Promise.catch(handleData)
于 2018-02-16T10:13:41.147 回答