我遇到了下面的代码块...我不明白。我完全理解了诺言(以及随之而来的一切):
deferred.then(successCb, errorCb);
但是,下面的代码似乎有三个回调(
complete
,fail
,done
),而且我不知道从哪里开始查找-我只能猜测类似可观察性的success
,failure
, finally
模式,但事实并非如此。我检查了诸如jQuery deferreds and promises - .then() vs .done()之类的随机问题以及诸如here之类的一些文档。文档似乎暗示
complete
根本不是东西,只有always
(运行诺言成功还是失败,运行解析),done
(“如果$ .get成功,它将运行”-奇怪的名称),fail
(失败)条件。 var promise = $.ajax({
type: 'POST',
url: 'www.foo.com',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
data: muhData
});
promise.complete(function(d) {
console.debug("complete");
}).fail(function(){
console.error("failed!");
}).done(function(d){
console.log('Done');
});
tl; dr:需要输入代码吗?
最佳答案
.complete()
,.done()
和.fail()
都是不遵守承诺标准的jQuery特定实现。 jQuery还支持jQuery 3.x中的.then()
,他们试图使.then()
符合promise标准。我建议您这样做是:
$.ajax({
type: 'POST',
url: 'www.foo.com',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
data: muhData
}).then(function(d) {
console.debug("complete");
}, function() {
console.error("failed!");
});
或者,如果您被迫使用旧版本的jQuery并想要标准的兼容行为,则可以执行以下操作:
Promise.resolve($.ajax({
type: 'POST',
url: 'www.foo.com',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
data: muhData
})).then(function(d) {
console.debug("complete");
}).catch(function() {
console.error("failed!");
});
这将jQuery Promise转换/吸收为标准Promise,因此您可以随后将标准
.then()
和.catch()
逻辑与其一起使用,并且对其工作原理也不会感到惊讶。以下是jQuery docs中有关
.complete()
,.done()
和.fail()
的更多信息:不建议使用
.complete()
,而应使用.always()
。这称为诺言是实现还是拒绝(例如,它总是被调用)。.fail()
与.catch()
相似,因为当诺言被拒绝时,它会被调用(尽管在所有方面都不相同)。.done()
与传递给.then()
的第一个参数类似,因为在实现诺言时会调用它。老实说,我不认为直接使用jQuery Promise逻辑是不值得的,因为这些天您可能在应用程序中的其他地方具有行业标准的逻辑,并且使用两个稍有不同的实现是很痛苦的。对于使用jQuery ajax的简单事情,我只是在jQuery promise上坚持使用
.then()
。对于具有嵌套或链接的诺言的更多涉及的事物,我使用Promise.resolve()
转换为标准诺言,因此我知道它在所有情况下的确切行为,并且将与代码中的所有其他诺言一样工作。