将ajax称为延迟承诺并接收错误

时间:2013-03-01 11:15:25

标签: jquery deferred promise

我正在尝试使用以下代码,但我显然很难理解$ .Deferred是如何工作的。请有人帮忙。

这个想法是,调用GetParameters,处理结果,调用GetStats,处理结果。还要将busy设置为true,将false设置为after。我期待只有一个错误传播到.fail()。

    self.refreshParams = $.ajax({
            url: self.ToAddress() + "/GetParameters",
            data: "{}",
            type: "GET",
            contentType: "application/javascript",
            dataType: "jsonp"
        });

    self.refreshMachines = $.ajax({
            url: self.ToAddress() + "/GetStats",
            data: "{}",
            type: "GET",
            contentType: "application/javascript",
            dataType: "jsonp"
      });

    self.refresh = function () {
      var d = $.Deferred();

      d.pipe(self.refreshParams)
      .done(function (p) {
          self.params(p);
      });

      d.pipe(self.refreshMachines)
      .done(function (m) {
          self.machines(m);
      });

      d.always(function() {
        self.busy(false);
      })
      .fail(function (x, e) {
          self.errorText(x);
      });

      d.resolve();
    }

更新:

我已将其更改为:

        self.refreshParams = function() {
          return $.ajax({
                url: self.ToAddress() + "/GetParameters",
                data: "{}",
                type: "GET",
                contentType: "application/javascript",
                dataType: "jsonp"
            });
        };

        self.refreshMachines = function() {
          return $.ajax({
                url: self.ToAddress() + "/GetStats",
                data: "{}",
                type: "GET",
                contentType: "application/javascript",
                dataType: "jsonp"
          });
        };

        self.refresh = function () {

          $.when(self.refreshParams(), self.refreshMachines())
          .done(function (p, m) {
              self.params(p[0]);
              self.machines(m[0]);
          })
          .done(function() {
            self.busy(false);
          })
          .fail(function (x, e) {
              self.errorText(x);
          });
        }

如果服务已经启动,这似乎有效,但是如果出现错误,那么什么都不会归结为.fail?

1 个答案:

答案 0 :(得分:0)

编写此类代码没有独特的方法。

对于两个ajax操作,您会发现使用单独的.done()处理程序和.fail()处理程序更好,从而保持其成功和错误处理彼此独立。

然后,响应复合.when()观察者所需要做的就是重置忙状态标志。通过在.always()处理程序中执行此操作,无论两个ajax操作的结果如何,都将重置它。

我可能会这样写:

self.refresh = function () {
    self.busy(true);

    var paramsPromise = self.refreshParams().done(self.params).fail(function (jqXHR, textStatus, errorThrown) {
        self.errorText('refreshParams() : ' + textStatus + ' : ' + errorThrown);
    });
    var machinesPromise = self.refreshMachines().done(self.machines).fail(function (jqXHR, textStatus, errorThrown) {
        self.errorText('refreshMachines() : ' + textStatus + ' : ' + errorThrown);
    });

    $.when(paramsPromise, machinesPromise).always(function () {
        self.busy(false);
    });
};