我有以下piece of code
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语句中的第一个分支得到执行?
发布于 2018-02-14 13:53:09
这主要与JavaScript处理在promises中抛出的异常的方式有关。它们需要使用绑定到https://bucklescript.github.io/bucklescript/api/Js.Promise.html#VALcatch的https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch来处理,因为它们被“捕获”在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-16 18:13:41
因为承诺就是承诺,不管它是不是失败的承诺。在您的情况下,在某个时刻,它将被解析为失败的承诺,但它永远不会引发/抛出错误。它只是一个promise,它的内部值在某一时刻将是一个错误(一个非抛出的错误)。
为了捕获错误(或值),需要在test绑定上使用catch函数。catch函数处理被拒绝的承诺,而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)https://stackoverflow.com/questions/48780134
复制相似问题