【问题标题】:deferred- code working with fail/done but not working with then延迟代码使用失败/完成但不使用 then
【发布时间】:2015-12-23 19:42:42
【问题描述】:

我有一个名为func1 的函数,它调用var dfd = $.ajax,并返回dfd.promise(),现在在我的主函数中,我有这样的代码:

function addOperation() {
   var addPromise = func1();
   addPromise.then(
     function(sender, args, msg) {
       alert("success");
     },

     function() {
       alert("fail");
     });
 }

上面的代码不起作用,对我有用的是:

function addOperation() {
  var addPromise = func1();
  addPromise.fail(
      function(sender, args, msg) {
        alert("fail");
      })
    .done(
      function() {
        alert("success");
      });
}

据我了解, then(functionSuccess, functionFail) 与在原始承诺上调用 .done 和 .fail 相同,不是吗?我迷失了。

【问题讨论】:

  • 你也可以提供 func1 吗?

标签: javascript jquery promise deferred


【解决方案1】:

你不应该从你的函数返回dfd.promise()$.ajax的返回值是承诺。

直接返回dfd即可(或$.ajax的结果)

docs 说得最好:

从 jQuery 1.5 开始,由 $.ajax() 返回的 jqXHR 对象实现了 Promise 接口,为它们提供了 Promise 的所有属性、方法和行为(有关更多信息,请参见 Deferred 对象)。这些方法采用一个或多个在 $.ajax() 请求终止时调用的函数参数

【讨论】:

  • 但是在这种情况下返回 dfd.promise() 呢?
  • @Grundy 现在用英语吗?
  • 我的意思是,为什么我们不应该使用 dfd.promise()$.ajax 函数的结果和 $.ajax(...).promise() 的结果有什么区别?
  • @Grundy 显然,一种方法有效,另一种无效。
  • @Natalie - 那么您所做的与您描述的不同,因为这个简单的示例按预期工作:jsfiddle.net/ya1ec7e4您使用的是什么版本的 jQuery?
【解决方案2】:

$.ajax 返回的 jqXHR 对象实现了 Promise 接口。

从 jQuery 1.5 开始,由 $.ajax() 返回的 jqXHR 对象实现了 Promise 接口,给他们所有的属性、方法和 Promise 的行为(有关详细信息,请参阅 Deferred 对象)。

因此,func1 应该只返回 $.ajax 返回的值。

【讨论】:

    猜你喜欢
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2019-07-20
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多