jQuery Promises和Backbone

seh*_*mel 18 promise backbone.js

我发现这段代码可以满足我的需求:

var promise = this.model.save();
$.when(promise).then(function() {
     console.log(promise.responseText);
});
Run Code Online (Sandbox Code Playgroud)

我想responseText从我的Backbone电话回来this.model.save().此代码记录在此处.但即使我在console.log()通话中拉出原始文本字符串,它也没有记录任何内容.

有人可以用非专业人的术语解释jQuery的承诺是什么吗?我已经读过他们了,但我认为我不知道他们是什么.这可能有助于我理解为什么这段代码不适合我.如果我console.log(promise)介于第一行代码和第二行代码之间,那么我就得到了responseText.因此,一些在发生任一$.whenthen导致此出问题.

编辑:

阅读完文章后,我发现我可以这样做:

var promise = this.model.save(); 
$.when(promise).then(null, function(obj) {
    console.log(obj.responseText);
});
Run Code Online (Sandbox Code Playgroud)

但我不明白null代表什么. then似乎有两个参数,一个成功函数和一个失败函数.但成功功能不是第一个吗?我从服务器得到200响应.

mac*_*ost 28

首先,我很确定你不需要这个when部分; 来自jQuery文档:

从jQuery 1.5开始,$ .ajax()返回的jqXHR对象实现了Promise接口,为它们提供了Promise的所有属性,方法和行为(有关更多信息,请参阅Deferred对象).

由于Promise已经有了一个then方法,你可以这样做:

this.model.save().then(null, function(obj) {
    console.log(obj.responseText);
});
Run Code Online (Sandbox Code Playgroud)

(对于我来说,上面的代码几乎像英文句子一样是使用Deferreds的一个主要优点.)

至于你的null论点,文档再次非常明确.有三个签名then(这只是为了涵盖不同的jQuery版本;任何给定的版本都有更少):

deferred.then(doneFilter [,failFilter] [,progressFilter])

deferred.then(doneCallbacks,failCallbacks)

deferred.then(doneCallbacks,failCallbacks [,progressCallbacks])

如您所见,所有三个首先采用"完成"功能,然后采用故障功能.这似乎意味着你正在失败,这令人困惑.避免这个问题的一种方法是根本不使用then.相反,请尝试以下方法:

this.model.save().always(function(obj) {
    console.log(obj.responseText);
});
Run Code Online (Sandbox Code Playgroud)

无论发生什么,这都会使你的函数被调用.但是,您可能应该弄清楚发生了什么,因此您可能希望添加成功和失败回调来进行一些调试:

this.model.save().done(function() {
    // Success case
}).fail(function() {
    // Failure case
});
Run Code Online (Sandbox Code Playgroud)

  • 这真的是风格.如果你正在做复杂的事情(比如说做两个AJAX调用,第二个需要从第一个回来的数据),那么Deferred样式可以让你非常优雅.否则,虽然这只是你想要如何设计代码的问题.实际上,这甚至不是特定于Backbone的问题; 在简单的旧jQuery中你还有`$ .ajax({success:handler});`vs,`$ .ajax({}).done(handler)`可供选择. (2认同)

Luk*_*kas 7

因为this.model.save返回承诺,您可以执行以下操作:

this.model.save()
    .done(function(response) {
        console.log("Success!");
    })
    .fail(function(response) {
        console.log("Error!");
    });
Run Code Online (Sandbox Code Playgroud)

(这比整$.when点容易.)

我的猜测是,虽然你的响应返回了200个代码,但它仍然"失败",因为响应数据类型与你期望的不一致(dataType$.ajax调用中属性中设置了什么).