scala.js.dom ajax.post,错误状态时出错
scala.js.dom ajax.post, error when error status
我正在使用 scala.js (0.6.5) 和 scala-js-dom (0.8.2) 并且我有一些带有 ajax.post 的奇怪 pb,当我收到错误状态(此处为 409)。
浏览器控制台显示一条错误消息,但我无法从我的 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 消息的错误?
这是意料之中的。 Ajax.post
returns a Future
和 Future
s 的 map
方法仅在 成功 情况下执行。 return 代码 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)
})
如果您希望在与成功return代码相同的代码中处理失败return代码,您可以先recover
将失败的 AjaxException(req)
变成成功的 req
:
request.recover {
// Recover from a failed error code into a successful future
case dom.ext.AjaxException(req) => req
}.map(req => {
// handle all status codes
}
我正在使用 scala.js (0.6.5) 和 scala-js-dom (0.8.2) 并且我有一些带有 ajax.post 的奇怪 pb,当我收到错误状态(此处为 409)。
浏览器控制台显示一条错误消息,但我无法从我的 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 消息的错误?
这是意料之中的。 Ajax.post
returns a Future
和 Future
s 的 map
方法仅在 成功 情况下执行。 return 代码 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)
})
如果您希望在与成功return代码相同的代码中处理失败return代码,您可以先recover
将失败的 AjaxException(req)
变成成功的 req
:
request.recover {
// Recover from a failed error code into a successful future
case dom.ext.AjaxException(req) => req
}.map(req => {
// handle all status codes
}