1

我试图让下面的代码工作,但我显然误解了 $.Deferred 的工作原理。请有人帮忙。

思路是,调用GetParameters,处理结果,调用GetStats,处理结果。还将busy 设置为true before 和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?

4

1 回答 1

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);
    });
};
于 2013-03-01T12:26:44.980 回答