下面是一些代码,它采用 Backbone 模型,保存它,然后等待响应并触发 jQuery .done() 或 .fail() 代码。这工作正常,但在失败时,我们实际上希望从服务获取返回的消息,并将其添加到我们的错误对象中。这一切都在 Backbone validate() 函数内;在此代码之后,我们检查错误对象并显示消息(如果有)。
看起来如果我们 .fail(),一切都会停止执行。我们需要继续验证功能。我找到了这个问题/答案,但似乎没有什么区别:Is there a way to continue after one deferred fails?
有什么方法可以在遇到 deferred.fail() 后继续执行代码吗?
addressModel.save().done(function() {
console.log("promise done");
model.set("...", false);
}).fail(function(response) {
console.log("promise fail");
if (response.responseJSON && response.responseJSON._messages) {
_.each(response.responseJSON._messages, function(value, key) {
errors[key] = value[0];
});
}
});
最佳答案
这是可能的,但很棘手 - 至少在 3.0 之前是这样。诀窍是:
- 不要使用
.fail
,使用.then
。 - 返回已解决的失败延迟。
这就像表明我们已经处理了这里遇到的异常:
var p = addressModel.save().then(function() {
console.log("promise done");
model.set("...", false);
}, function(response) {
console.log("promise fail");
if (response.responseJSON && response.responseJSON._messages) {
_.each(response.responseJSON._messages, function(value, key) {
errors[key] = value[0];
});
}
return $.Deferred().resolve(); // return a resolved deferred
});
这会让你做:
p.then(function(){
// this code runs when either failure or success happened, can also chain
});
关于javascript - deferred.fail()后如何继续执行JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29526281/