【问题标题】:jQuery Deferred - returning promises up a call chainjQuery Deferred - 返回一个调用链的承诺
【发布时间】:2012-03-06 06:08:14
【问题描述】:

已解决

我在 jQuery 1.7.1 中遇到了 $.Deferred 的问题。我认为 when/then/fail 等返回值的行为与我认为的不同。

这就是我想要做的:

  1. 调用$.when(setInstall(true)).then('do something');(这有效,它等待ajax请求)
  2. --> 调用 this.inInstallableRegion() 来运行 ajax 请求。
  3. ---> AJAX请求成功后,我想根据AJAX请求的结果来解析或拒绝inInstallableRegion$df
  4. ----> this.inInstallableRegion 检测到有错误,因此它拒绝了$df 的承诺(这有效),我希望它返回给setInstall我假设this.inInstallableRegion$.done() 的返回值作为this.inInstallableRegion 的结果返回(即在这种情况下被拒绝)。

由于某种原因它拒绝$df,但是当我转到setInstall 时,它运行$.done 函数,而不是$.fail 一个:.. 我错过了什么吗?

对不起,真的不能为此做一个 jsfiddle :\ 想不出一种更简化它的方法......我的大脑完全炸了 :|

这是两个函数:

    this.setInstall = function (status) {
        $df1 = new $.Deferred();
        if (status === true) {
            var self = this;
            return $.when(this.inInstallableRegion()).done(function (json) {
                self.setInstallDetail(json);
                self.setDispatchCompany();
                $df1.resolve();
                return $df1.promise();
            }).fail(function (json) { 
                self.notifyNoInstall(json.error); 
                self.setInstall(false);
                self.setDispatchCompany();
                $df1.reject();
                return $df1.promise();
            });
        } else {
            this.setInstallDetail({
                install: 0,
                ref_id: 0,
                retail_price: 0
            });
        }
        this.setDispatchCompany();
        $df1.resolve();
        return $df1.promise();
    };

/////////////////////////////////

this.inInstallableRegion = function () {

    $df = new $.Deferred();

    var params = {
        dataType: 'json',
        data: $.param({
            'zip': this.order.delivery.zip
        }),
        action: 'getinstaller',
        cache: true
    };

    return $.when(this.sendData(params, 'installerCache', true)).done(function (json) {
        if (json.error) {
            $df.reject();
            return $df.promise();
        } else {
            $df.resolve();
            return $df.promise();
        }
    });

};

【问题讨论】:

    标签: jquery jquery-deferred


    【解决方案1】:

    我想通了。

    为了让 setInstall 等待 inInstallableRegion 完成,inIntsallableRegion 必须返回一些东西。只返回 ajax 请求是行不通的,因为它会在完成与否时返回。它不会根据 ajax 请求的结果返回我是否想接受或拒绝。

    所以我只是让它返回它自己的延迟对象,即 ajax 运行时间和结果处理时间。我在 inInstallableRegion 中做到了这一点

    var self = this;
    return $.Deferred(function(dfd) {
      self.sendData(params, 'installerCache', true).then(function(json) {
        if(json.error) {
          dfd.reject();
        } else {
          dfd.resolve();
        }
        return dfd.promise();
      });
    });
    

    【讨论】:

      猜你喜欢
      • 2015-11-27
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 2016-06-15
      • 2017-12-21
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      相关资源
      最近更新 更多