0

コードはかなりまっすぐな序文です:

  var handleNextPressedDeferred = $.Deferred();
  $('input:button').live('click',function(){
    console.log('resolving');
    return handleNextPressedDeferred.resolve();
  });

  handleNextPressedDeferred.pipe(function(){
    console.log('rejecting');
    return $.Deferred().reject();
  });

  var handleNextPressedPromise = handleNextPressedDeferred.promise();

  handleNextPressedPromise.done(function(){
    console.log('done');
  });
  handleNextPressedPromise.then(function(){
    console.log('then');
  });
  handleNextPressedPromise.fail(function(){
    console.log('fail');
  });

元のボタンクリックで遅延が解決された後、パイプ関数によってそれを拒否することに興味があります。

ボタンがクリックされたときに期待される結果は次のとおりです。

  • 解決
  • 拒否する
  • 不合格

ボタンがクリックされたときの実際の結果は次のとおりです。

  • 解決
  • 拒否する
  • 終わり
  • それから

ここで正しく理解していないことは何ですか?私はこれの何百万ものバリエーションを試しましたが、期待どおりに機能させることができませんでした。

4

1 に答える 1

2

.pipe新しいを作成しDeferredます。あなたのコードでは、あなたは「接続」.done.then.failいて、拒否されていない前のDeferredに、それが理由.doneで、の.then代わりに実行されます.fail

これを置き換えてみてください:

handleNextPressedDeferred.pipe(function(){
    console.log('rejecting');
    return $.Deferred().reject();
});

var handleNextPressedPromise = handleNextPressedDeferred.promise();

var handleNextPressedPromise = handleNextPressedDeferred.pipe(function(){
    console.log('rejecting');
    return $.Deferred().reject();
}).promise();

そしてそれは動作します。

ここでフィドル

編集:

thenコードでとの両方を使用pipeしているようです。使用しているjQueryのバージョンはわかりませんが、jQuery 1.8以降、厳密に同等であり、両方とも新しいDeferredを返すことに注意してpipeくださいthen。およびthenの構文糖衣ではなくなりました。.done.fail

詳細については、jQueryの延期と約束-.then()と.done()およびpipe()とthen()のドキュメントとjQuery1.8の現実を参照してください。

于 2012-12-10T16:04:36.683 に答える