我遇到了下面的代码块...我不明白。我完全理解了诺言(以及随之而来的一切):

deferred.then(successCb, errorCb);


但是,下面的代码似乎有三个回调(completefaildone),而且我不知道从哪里开始查找-我只能猜测类似可观察性的successfailurefinally模式,但事实并非如此。

我检查了诸如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()转换为标准诺言,因此我知道它在所有情况下的确切行为,并且将与代码中的所有其他诺言一样工作。

10-05 20:53
查看更多