我发现这段代码能够满足我的需求:
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
。因此导致此错误的$.when
或then
正在发生某些事情。
编辑:
阅读完文章后,我发现我可以这样做:
var promise = this.model.save();
$.when(promise).then(null, function(obj) {
console.log(obj.responseText);
});
但我不明白null
代表什么。 then
似乎有两个参数,一个成功函数和一个失败函数。但成功功能不是第一个吗?我收到服务器的200响应。
答案 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"字段,事件以为您的服务器确实创建了该项目。