jQuery Deferred - 返回承诺调用链

时间:2012-03-06 06:08:15

标签: jquery jquery-deferred

分辨

我在jQuery 1.7.1中遇到$.Deferred的问题。我认为从/当/失败等返回值的行为与我认为它应该是不同的。

这就是我要做的事情:

  1. 调用$.when(setInstall(true)).then('do something');(这样可行,等待ajax请求)
  2. - >调用this.inInstallableRegion()运行ajax请求。
  3. --->当AJAX请求成功时,我想根据AJAX请求的结果解析或拒绝inInstallableRegion的{​​{1}}。
  4. ----> $df检测到有错误,因此拒绝了this.inInstallableRegion的承诺(这有效),我希望将其返回$df我假设 setInstall this.inInstallableRegion的返回值作为$.done()的结果返回(即在这种情况下被拒绝)。
  5. 出于某种原因,它会拒绝this.inInstallableRegion,但当我转到$df时,它会运行setInstall函数,而不是$.done函数:..我错过了什么?

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

    这是两个功能:

    $.fail

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

        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();
        };
    

1 个答案:

答案 0 :(得分:4)

我明白了。

为了让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();
  });
});