我试图理解在
然而,对于 promises,如果我想在 .then() 中执行类似的操作,我被告知应该抛出错误,然后让 .catch() 捕获它。
我的担忧是,我想区分 promise 内部成功但结果不佳的操作和 promise 内部失败的操作。
例如,如果我执行一个 AJAX 调用并返回404,则无法恢复,因此拒绝并弹出一个消息框,显示“出现了一些问题”。
然而,如果 AJAX 请求成功(返回状态200),但响应表明某些内容不正确(例如用户没有填写正确值的字段),那么我希望以某种方式处理它,这可能涉及到不仅仅是弹出一个带有消息的弹窗(例如 DOM 操作、红色文本等),这些操作如果是404则可能不需要执行。
以下是两个示例,更好地说明我的意思。
第一个是使用回调函数的原始实现,第二个是使用 promises 的实现(使用 Q promise 库将其包装为适当的 promise)。
在promise版本中,如果请求返回404,则会立即进入
如果
如果我想分别处理这两种失败情况,该怎么办?
我没有在任何地方调用resolve或reject,这有问题吗?
我希望尽可能遵循最佳实践。
.then()
中正确指示失败的方法。如果 promise 没有失败(例如返回状态200的 AJAX 请求),但我决定结果无效,通常我会弹出一个窗口向用户解释问题,并执行 "return false;" 以尽早退出方法。然而,对于 promises,如果我想在 .then() 中执行类似的操作,我被告知应该抛出错误,然后让 .catch() 捕获它。
我的担忧是,我想区分 promise 内部成功但结果不佳的操作和 promise 内部失败的操作。
例如,如果我执行一个 AJAX 调用并返回404,则无法恢复,因此拒绝并弹出一个消息框,显示“出现了一些问题”。
然而,如果 AJAX 请求成功(返回状态200),但响应表明某些内容不正确(例如用户没有填写正确值的字段),那么我希望以某种方式处理它,这可能涉及到不仅仅是弹出一个带有消息的弹窗(例如 DOM 操作、红色文本等),这些操作如果是404则可能不需要执行。
以下是两个示例,更好地说明我的意思。
第一个是使用回调函数的原始实现,第二个是使用 promises 的实现(使用 Q promise 库将其包装为适当的 promise)。
$.ajax({
url: "/cars/1",
type: "GET",
contentType: "application/json; charset=utf-8",
dataType: "json"
})
.done(function (data) {
if (!data.IsSuccessful) {
//The request was successful (status 200), but the server is returning IsSuccessful=false
alert(data.Message);//message says something like "we have that car in our catalogue but we don't have it in stock"
return false;//early exit from .done()
}
//if it gets here, everything is good and I can do something with the result
})
.fail(function (data) {
//The request actually failed due to a generic status 500 error which has something I don't necessarily want to expose in a popup to the user
alert("Something went wrong");
});
Promise版本:
var myPromise = Q(
$.ajax({
url: "/cars/1",
type: "GET",
contentType: "application/json; charset=utf-8",
dataType: "json"
})
);
myPromise.then(function (data) {
if (!data.IsSuccessful) {
throw new Error(data.Message);
}
//all good, lets do something with the result
})
.catch(function (error) {
//what is error?
//How do I know if it's one that I want to show to the user or not?
}).done();
在promise版本中,如果请求返回404,则会立即进入
.catch()
,对吗?如果
data.IsSuccessful==false
,那么它也会进入.catch()
吗?如果我想分别处理这两种失败情况,该怎么办?
我没有在任何地方调用resolve或reject,这有问题吗?
我希望尽可能遵循最佳实践。