scala.js.dom ajax.post,错误状态时出错

时间:2015-11-25 17:02:59

标签: scala.js

我使用scala.js(0.6.5)和scala-js-dom(0.8.2),当我收到错误状态(这里是409)时,我有一个带有ajax.post的奇怪pb。
浏览器控制台显示错误消息,但是从我的scala代码中,我无法访问状态代码和返回的消息。

以下是我用于发送POST的代码:

val request = Ajax.post(
  url,
  data = postData,
  headers = bsHeaders)

request.map(xhr => {
  log.debug("response text: " + xhr.responseText)

  if (xhr.status == 201) {
    try {
      val loc = xhr.getResponseHeader("Location")
      if(loc == locHeaderResp) {
        loc
      } else {
        log.error(s"Location header invalid: ${loc}")
      }
    } catch {
      case e:Exception => {
        log.error("Couldn't read 'Location' header " + e.getMessage)
        log.debug("List of headers: " + xhr.getAllResponseHeaders())
        ""
      }
    }
  } else if (xhr.status == 409) {
    log.error("" + xhr.responseText)
    log.error(s"${xhr.responseText}")
  } else {
    log.error(s"Request failed with response code ${xhr.status}")
    log.error(s"${xhr.responseText}")
  }
})

当状态为201时,效果很好。

在我的情况下,当我发送的数据已经存在时,我应该得到一个409错误代码,带有一些消息状态。确实如此,从浏览器调试工具来看。

我希望能够在执行'request.map'时管理错误情况,但是当返回错误代码时,不会执行此代码。

那么如何用POST消息管理错误呢?

1 个答案:

答案 0 :(得分:10)

这是预期的。 Ajax.post会返回Future,而map Future方法仅针对成功的案例执行。返回代码409被视为失败,因此将以失败的状态完成未来。

要使用Future来处理失败,您应该使用他们的onFailure方法:

request.map(req => {
  // ... handle success cases (req.status is 2xx or 304)
}).onFailure {
  case dom.ext.AjaxException(req) =>
    // ... handle failure cases (other return codes)
})

如果您希望在与成功返回代码相同的代码中处理失败返回代码,则可以首先 recover将失败的AjaxException(req)变为成功req 1}}:

request.recover {
  // Recover from a failed error code into a successful future
  case dom.ext.AjaxException(req) => req
}.map(req => {
  // handle all status codes
}