jQuery Promises和Backbone

时间:2013-01-18 20:42:59

标签: backbone.js promise

我发现这段代码能够满足我的需求:

var promise = this.model.save();
$.when(promise).then(function() {
     console.log(promise.responseText);
});

我想从我的Backbone调用responseText回复this.model.save()。该代码记录在案here。但即使我在console.log()调用中拉出原始文本字符串,它也没有记录任何内容。

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

编辑:

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

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

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

3 个答案:

答案 0 :(得分:28)

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

  

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

由于Promise已经有then方法,您可以这样做:

this.model.save().then(null, function(obj) {
    console.log(obj.responseText);
});

(上述代码几乎就像英语句子这样的事实是使用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);
});

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

this.model.save().done(function() {
    // Success case
}).fail(function() {
    // Failure case
});

答案 1 :(得分:7)

由于this.model.save会返回承诺,您可以执行以下操作:

this.model.save()
    .done(function(response) {
        console.log("Success!");
    })
    .fail(function(response) {
        console.log("Error!");
    });

(这比整个$.when位更容易。)

我的猜测是,尽管您的响应返回了200个代码,但仍然“失败”,因为响应数据类型与您期望的内容不匹配(dataType属性中设置的内容$.ajax来电。{/ p>

答案 2 :(得分:0)

我是使用诺言的忠实粉丝,我认为诺言在不同的包中意味着非常相似的东西。

要回答您的问题,以前的答案没有,"然后"功能是承诺的功能,"当"函数是一个失败保存,对象不是一个承诺,一个"当(obj)"将确保它是一个承诺,以便您可以使用优雅的xxx.then(success(){},error(){})。

顺便说一句,"延期" machineghost说的是让你使用诺言的套餐。 为了开始了解承诺以及如何使用它。看看这个教程。它非常清楚地解释了每一件事,这篇文章让我如此投入了承诺。 http://strongloop.com/strongblog/promises-in-node-js-with-q-an-alternative-to-callbacks/

现在,正如machineghost所说,根据REST API文档,https://parse.com/docs/rest#(不知道它是否与骨干相同),似乎您的同步调用出错了,服务器将会响应"创建"的JSON对象请求格式为:

{"createdAt": "2011-08-20T02:06:57.931Z","objectId": "Ed1nuqPvcm"}

我的猜测是,也许你的服务器没有用正确的JSON响应请求,所以save()认为操作失败,因为没有" createAt"字段,事件以为您的服务器确实创建了该项目。