承诺

时间:2018-02-14 05:18:20

标签: exception exception-handling promise reason bucklescript

我有以下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语句中的第一个分支被执行?

2 个答案:

答案 0 :(得分:3)

这主要与JavaScript处理在promises中抛出的异常的方式有关。它们需要使用绑定到https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catchhttps://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)