javascript - deferred.fail()后如何继续执行JS

标签 javascript jquery backbone.js promise jquery-deferred

下面是一些代码,它采用 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/

相关文章:

javascript - 使用 jquery/php 在 mysql 中进行内联更新

javascript - 如何在删除模型 :backbone. js 和 marionettejs 时使用另一个模板

javascript - 了解 backbone.js 属性和 toJSON()

javascript - 根据传递的 url 参数单击表单按钮

jquery - 使用 jQuery 在 Flask/Jinja2 中具有不同 CSS 值的一类

javascript - 在缩放/缩放变换内计算 div 宽度/高度

javascript - 单击时格式化隐藏的嵌套列表时出现问题

javascript - JavaScript 中 self.self == self check 的目标是什么?

c# - 直接在 Word 中打开位于 webDAV 服务器中的 .doc

javascript - 如何改变每次测试之间的 spy 结果