1

次のコードを機能させようとしていますが、$。Deferredがどのように機能するかを明らかに誤解しています。誰か助けてください。

アイデアは、GetParametersを呼び出して結果を処理し、GetStatsを呼び出して結果を処理することです。また、ビジーを前にtrueに設定し、後にfalseに設定します。.fail()に伝播するエラーは1つだけだと思います。

    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

このタイプのコードを記述する独自の方法はありません。

.done()2 つの ajax 操作に対して個別のハンドラーとハンドラーを使用して作業する方が良いことがわかります。これにより.fail()、成功とエラーの処理を互いに独立した状態に保つことができます。

.when()次に、複合ウォッチャーに応答して行う必要があるのは、ビジー ステータス フラグをリセットすることだけです。ハンドラーでこれを行う.always()と、2 つの 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 に答える