我有以下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语句中的第一个分支被执行?
答案 0 :(得分:3)
这主要与JavaScript处理在promises中抛出的异常的方式有关。它们需要使用绑定到https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch的https://bucklescript.github.io/bucklescript/api/Js.Promise.html#VALcatch来处理,因为它们被“捕获”在promise中,并保留在promise上下文中。
具体而言,我会把你的例子变成这样:
_ = Alamofire.request("httpbin.org/get").rx.responseJSON()
.map { value in
let json = value as? [String: Any] ?? [:]
let origin = json["origin"] as? String ?? "unknown" print(origin)
return origin }
.subscribe(onNext: { print("Origin:", $0) })
答案 1 :(得分:2)
因为承诺是承诺,无论承诺是否失败。 在您的情况下,在某些时候它将被解决为失败的承诺,但它永远不会引发/抛出错误。它只是一个承诺,其内在价值,在某些时候将是一个错误(一个非抛出的错误)。
为了捕获错误(或值),您需要在catch
绑定上使用test
函数。 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)