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.因此,一些在发生任一$.when或then导致此出问题.
编辑:
阅读完文章后,我发现我可以这样做:
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)
因为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调用中属性中设置了什么).
| 归档时间: |
|
| 查看次数: |
23105 次 |
| 最近记录: |