4

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

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

多分これはを使ってできるので.pipeはないかと思いますが、どうすればいいのかわかりません。

アップデート:

注:@FrédéricHamidiのコメントに従って、上記のテキストの一部も修正しました。

私が達成しようとしていることは次のとおりです。

サーバーに対してajax呼び出しを行うAPIがあり、それらはajaxオブジェクト($ .Deferred自体)を返します。

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

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

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

そのため、新しい$ .Defferredを作成して返すことができ、再試行ボタンのコールバックで$ .ajax自体を呼び出して、defferredイベントを「リレー」/転送するように設定することができました。閉鎖の一部としてそれを穴あけする。

しかし、私はそれを行う方法がわかりませんでした。メソッドとの私の取り違え.pipeは、その説明が次のように言っているためです。

遅延をフィルタリングおよび/またはチェーンするためのユーティリティメソッド。

私はこれが私の質問をより明確にすることを願っています。

4

2 に答える 2

1

私が正しく理解していれば、延期されたものを解決/拒否し、ajaxリクエストとまったく同じ値で通知したいだけですか?その場合、Deferredオブジェクトがdeferと呼ばれると仮定すると、次のコードでうまくいきます。

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

これは、defer.resolve、defer.reject、およびdefer.notifyが字句的にバインドされているために機能します。コンテキスト(this)と値(引数)が適切に渡されるため、ajaxpromiseの状態を新しいdeferredに効果的に転送できます。

于 2012-04-22T17:28:40.120 に答える
0

2つの遅延オブジェクトd1とd2がある場合、次の方法でd2からd1に伝播できます。d2.then(d1.resolve,d1.reject,d1.notify)

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

于 2013-08-09T17:54:11.923 に答える