5

から返された約束を使用しようとしていますBackbone.model.save()。実際には、仕様ごとに、有効な場合は promise を返し、そうでない場合は false を返します。今後は型に関係なく戻り値を利用したいと思いdeferred.done()ますdeferred.fail()。このような:

var promise = model.save();

$.when(promise).done(function() {
   console.log('success!');
});

$.when(promise).fail(function() {
   console.log('dang');
});

しかし、$.when()non-promise を渡すと発火done()するので、上の例では、モデルが無効な場合に$.when(false).done()発火し、「成功しました!」となります。

successでおよびerror属性を使用できることはわかっていますsave()が、私のコードでは、done()後で複数の関数を適用する方が有利です。それが約束の力です。

だから、私は残っています:

var promise = model.save();

if (promise) {
    $.when(promise).done(function() {
        console.log('success!');
    });

    $.when(promise).fail(function() {
        console.log('dang');
    });
} else {
    console.log('dang');
}

DRYではないのが嫌いです。

var promise = model.save();

var fail = function() {
    console.log('dang');
};

if (promise) {
    $.when(promise).done(function() {
        console.log('success!');
    });

    $.when(promise).fail(function() {
        fail();
    });
} else {
    fail();
}

かなり乱雑になっています。あなたは絵を手に入れます。ここで何かが足りないことを願っています。

4

2 に答える 2

1

これは以前の回答を改善したものですが、エラー処理のサポートが向上しています。エラーを飲み込むのを避けるために必要だったので、私がしたことは次のとおりです。

var oldSaveFunction = Backbone.Model.prototype.save;
Backbone.Model.prototype.save = function () {
  var returnedValue = oldSaveFunction.apply(this, arguments),
    fulfiller,
    rejecter,
    pendingPromise = new Promise(function (fulfill, reject) {
      fulfiller = fulfill;
      rejecter = reject;
    });

  if (_.isBoolean(returnedValue)) {
    rejecter(this.validationError);
  } else {
    // Assuming returnedValue is a deferred
    returnedValue.then(function success() {
      fulfiller.apply(this, arguments);
    }, function failure(jqxhr, errorName, error) {
      rejecter(error);
    });
  }

  return pendingPromise;
};

それが役に立てば幸い!

于 2016-12-15T05:08:37.197 に答える