18

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

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

responseText我想从我的 Backbone 调用中取回this.model.save(). 此处记录了此代码。但它没有记录任何东西,即使我在console.log()调用中提取了一个原始文本字符串。

有人可以用外行的术语解释什么是 jQuery 承诺吗?我读过它们,但我不认为我完全明白它们是什么。这可能有助于我理解为什么这段代码对我不起作用。如果我console.log(promise)在第一行和第二行代码之间,那么我会得到responseText. 因此,要么发生了一些事情,要么$.when导致了then这个问题。

编辑:

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

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

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

4

3 回答 3

28

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

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

由于 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
});
于 2013-01-18T23:39:14.527 回答
7

因为this.model.save返回一个 Promise,所以您可以改为执行以下操作:

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

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

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

于 2013-01-18T23:38:24.407 回答
0

我是使用 Promise 的忠实拥护者,我认为 Promise 在不同的包中意味着非常相似的东西。

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

顺便说一句,machineghost 所说的“延迟”是让你使用 promise 的包。开始了解 promise 以及如何使用它。看看这个教程。它非常清楚地解释了每一件事,正是这篇文章让我如此承诺。 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”字段,事件认为您的服务器确实创建了该项目。

于 2014-08-01T19:14:06.153 回答