2012-04-22 10 views
4

1つのJQuery.Deferred()オブジェクトのすべてのイベントを別のものに伝播するにはどうすればよいですか?JQuery.Deferredオブジェクト間のイベントの伝播

他のオブジェクト.rejectWith.resolveWithを呼び出すことによって、両方の.fail .then .doneを扱うより良い/単純/短い方法はありますか? 私は、拒否または解決を呼び出すときに呼び出されるので、 .done .thenを処理する必要はないと仮定しています。

おそらくこれは.pipeを使って行うことができると思われますが、わかりません。

UPDATE:

注:私も、私はフレデリック・ハミディさんのコメント@あたり上記の文章の一部を修正しました。私が達成しようとしています何

は以下の通りであった:

私は、彼らが($ .Deferredそのものである)Ajaxオブジェクトを返します 、サーバーへのAJAX呼び出しを作っていたAPIを持っていました。

ある時点で、私はネットワークを利用できなかった状況を処理する必要がありました(これは、モバイルデバイス上で実行されるphonegapアプリケーション用です)。

私がやりたかったのは、ネットワークに接続できない場合、ネットワークの問題を修正し、 "再試行"するように求めるダイアログを表示するということでした。

しかし、このシナリオでは、ユーザーが再試行するまで$ .ajaxを呼び出さないため、$ .Defferredオブジェクトがなく、最初にAPIで呼び出された関数を返すことはありません。

私は新しい$ .Defferredを作成してそれを返し、再試行ボタンのコールバックで$ .ajax自身を "リレー"に設定し、デファードされたイベントを私はちょうど閉鎖の一部としてそれを保持することによって戻った。

しかし、私はそれを行う方法がわかりませんでした。

ユーティリティメソッドフィルタリングおよび/またはチェーンのDeferredする:.pipe方法と私の重複が整理は、その記述が言うのでそのaがあります。

これは私の質問をより明確にします。

+0

は私が正しくあなたの質問を理解していません。 'then()'は 'fail()'を2番目の引数でカバーするので、同時に両方を使う必要はありません。 'pipe()'は実際に遅延呼び出しの結果を別のものに渡す方法ですが、その場合でも 'resolveWith()'、 'rejectWith()'、 'notifyWith()'を呼び出さなければなりません。 (または、 '$ .ajax()'のようなものを持っています)、パイプされた遅延呼び出しを解決します。達成したいことの例を挙げることができますか? –

+1

私はこの質問を読んで、突然、私は「jQuery.deferred」という概念全体について考えていないことに気付きました。 ...もう一晩中寝る。 =/ –

答えて

1

私が正しく理解していれば、Deferredは解決/拒否し、あなたのajaxリクエストとまったく同じ値で通知するだけです。もしそうなら、あなたの繰延オブジェクトが延期と呼ばれていると仮定すると、次のコードは、トリックを行います:defer.resolve、defer.rejectとdefer.notifyが辞書的にバインドされているので、

$.ajax(...).done(defer.resolve).fail(defer.reject).progress(defer.notify); 

をそれは動作します:コンテキスト(本)と値(引数)が正しく渡されるので、Ajax約束の状態を新しい延期に効果的に転送するだけです。

+0

ちょうど明確にするために - あなたが字句的に束縛されていると言ったら、それらの呼出しが文脈として 'defer'で実行されることを意味しますか? (すなわち、それらの中の 'this 'は'延期されるので、私は追加の代理パターンを使う必要はありません)。これが事実であることをどうお知りになりますか? – epeleg

+2

私はコードを書いた、それは私が知っている;) 'これは'延期されません、それはどんなコンテキストがajaxによって与えられるかです。しかし、resolve、reject、notifyはすべてクロージャ内で定義されているので、 'defer'の内部構造を適切に、期待どおりに使用します。 –

+0

:)私は光栄です。これはどこに文書化されていますか?私は何か似たようなことをしましたが、どこで閉じているのかわからなかったので、私は '$ .proxy(deffered、 'reject')'を使ってそれらを(再び)プロキシしました。 これにもショートカットがあるはずです。多分 '.tee(defer)'です。 – epeleg

0

あなたはD1およびD2 2つの繰延オブジェクトを、持っている場合は、あなたとD1とD2から伝播することができます。d2.then(d1.resolve,d1.reject,d1.notify)

例: http://jsfiddle.net/bgrossi/XTJEf/