問題タブ [jquery-deferred]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
jquery - jQuery。理解するとき
を使用しjQuery.when
て2つのajax
リクエストを起動し、2つのリクエストが完了した後に関数を呼び出そうとしています。これが私のコードです:
ただし、これは期待どおりに機能していません。Ajax呼び出しmethod1
は、で使用されるデータを返しshowData()
、Ajax呼び出しは、method2
var countに割り当てられ、後でで使用されるcountを返しますshowData()
。
しかし、上記のコードを実行method1
すると、呼び出されてから、データmethod2
をとしてshowData
残します。どうすればこれを達成できますか?私が知る限り、返される両方の関数が実行された場合にのみ進行します。両方のajax呼び出しを並行して呼び出し、両方の呼び出しの結果に基づいて後の結果を表示する必要があります。showData
'undefined'
$.when
$.promise
javascript - jquery 1.5でajaxリクエストのキューを管理する方法は?
私はjquery1.5で新しい遅延AJAX関数をテストしてきましたが、そのシンプルさとパワーに感銘を受けました。これらのリクエストをキューに入れるための最良の方法に関して、私が持っているより大きな質問があります。
必要に応じて、シリアルとパラレルの2つのシナリオがあります。同期/非同期の用語を避けたいのは、これらすべてを非同期リクエストにして、ユーザーがキューの処理を待っている間に他のアクションを実行できるようにするためです。次に、キューの処理が完了したときに1つの関数を呼び出します。
2つのリクエストがある「シリアルモード」では、次のように処理する必要があります。
RequestA-> ResponseA-> RequestB-> ResponseB-> EndOfQueue
2つのリクエストがある「パラレルモード」では、次の結果が必要です。
RequestA-> RequestB(ResponseA、ResponseBは準備ができたらいつでも処理されます)-> EndOfQueue
いずれの場合も、いずれかのリクエストが失敗した場合は、キューを停止して、失敗した関数に制御を渡します。
動的キューの長さを指定する要件があるので、.then()または.when()の遅延をまとめて文字列化することはできないと思います。これは、100アイテムか100アイテムかわからないためです。 。ベンダーのAPIを介してサーバー上でビジネスロジックを実行しているため、サーバー側のバッチ処理は、そのコードを制御できないため困難になります。
「並列」ケースを実行し、すべてが正常に完了した後にwhen()関数を呼び出すテストケースを作成しましたが、これらのテストはキューの長さが動的ではなく、シリアルモデルに移植できません。
これを処理するカスタムキューオブジェクトを作成する方法はわかりますが、すべての部分がすでにjquery(?)で記述されているようです。私は調べましたが、このようにシーケンシャルリクエストをカバーする例は見つかりませんでした。
jqueryキュー/遅延機能でこれを処理する方法について何か考えはありますか?
jquery - Jquery .when() と .then() が機能しない?
私は以下で何かを試しました:
http://api.jquery.com/jQuery.when/ Chrome コンソールのドキュメントに Uncaught type error: has no method when と表示されているのに何が問題なのですか?
@@''
javascript - 観察不可能な関数で$.deferredを適切に使用するにはどうすればよいですか?
たとえば、内部にランダムなコードを持つ2つの関数があり、ユーザーのシステム(低速、中速、高速)に基づいて、2つの関数が完了するまでにかかる時間を知る方法がない場合setTimeout
、完了後にfunction2
のみ発砲しようとする場合は実用的ではありません。 function1
時間の要件が何であれ、両方の関数が100%非jQuery関数であり、内部にjQueryコードがないため、jQueryで完全に監視できないことを考慮して、どのように使用jQuery.deferred
してfunction2
発火させることができますか? function1
せいぜい、関数には.css()
、時間の関連付けがなく、古いコンピューターでは実行速度が遅くなる可能性があるjQueryメソッドが含まれている可能性があります。
次のように呼び出すのと同じように、それfunction2
が同時に実行されていないことを確認するにはどうすればよいですか。function1
を使用して$.deferred
?それ以外の回答$.deferred
も大歓迎です!
3月20日追加: function1()がラムダ関数であり、ユーザー入力に応じて、関数に非同期呼び出しがある場合とない場合があり、関数が実行する操作の数を判断できない場合はどうなりますか?これは、次に何が起こるかについての手がかりがない関数ですが、何があっても、ラムダ関数(function1)からのすべてが完了した後にのみ、function2を実行する必要があります。時間がかかりますが、非同期の側面が完了する限り。これはどのように達成できますか?
3月22日追加: つまり、私が求めていることを実行する唯一の方法は、匿名関数をコールバックとして、実行後にコールバックを実行する非同期関数に渡すか、または必要なときに実行するイベントリスナーを作成することだと思います。イベントが最終的にトリガーされます。
アクションの実際の実行を処理するために、前述の関数を含むフレーム内にメカニズム(イベントハンドラー)を手動で構築せずに、2つの別々の行で非同期呼び出しを実行し、それらを順番に起動する方法は実際にはありません。
これらのタイプのメカニズムの良い例は、jQueryの.queue()
メソッドと$.Defferred
オブジェクトです。
.queue()
以下の回答は、 ingと使用に関するjQueryのAPIを読み、$.Deferred
これを明確にするのに役立ちました。
Tgrは、jQueryの$.Deferred
オブジェクトを使用してカスタムチェーン可能関数を作成する方法について以下の優れた例を示しました。カスタム関数自体には、必ずしもjQueryコードが含まれている必要はありません。これは、まさに私が探していたものです。
javascript - AJAXJQuery遅延コールバックは1回だけ呼び出されます
いくつかのjqueryajaxオブジェクトにコールバックを登録しています。
ので、私は持っています:
そして後でコールバック-他の場所
このコールバックと他のすべてのコールバックは、私が最初にキックオフするときに完全に機能します
g_userXHRに直接接続された.successは毎回呼び出されますが、関数の外部にアタッチされた他のコールバックは、main_getLogin()を初めて呼び出したときにのみ起動されます。
さらに、ajaxオブジェクトを宣言して後で送信する方法はありますか?g_userXHR.send();のように
ありがとうございました
jquery - jQueryの延期と約束-.then()と.done()
私はjQueryの延期と約束について読んでいますが、コールバックを成功させるために.then()
&を使用することの違いがわかりません。Eric Hyndsがそれについて言及し、同じ機能にマップしていること.done()
は知っていますが、操作が成功するとすべてのコールバックが呼び出されるため、そうだと思います。.done()
.success()
.then()
誰かが私に正しい使い方を教えてもらえますか?
jquery - 遅延オブジェクトにアタッチされている遅延オブジェクトにコールバックをどのようにアタッチしますか?
一連のカスケード ドロップダウン選択リストをサポートする ajax リクエストのチェーンがあります。1 番目のドロップダウンで値を選択すると、2 番目の値を設定するためのリクエストが起動され、それが完了すると (そしてドロップダウンが入力されると)、3 番目のドロップダウンを設定するために次のリクエストが起動されます。
これらのリクエスト チェーンの形成方法にはいくつかのバリエーションがあるため、jQuery Deferred オブジェクトを使用してリクエストを組み立てたいと考えていました。
2 番目のリクエストを最初のリクエストにチェーンする方法はわかりますが、3 番目のリクエストを 2 番目にチェーンする方法がわかりません。
その意図は、Step2 が解決されたときに Step3 がトリガーされることですが、によって返される遅延オブジェクトは.then(Step2)
Step1 からのものであるため、Step3 は Step1 へのコールバックとして追加されます。
この jsFiddle sampleをご覧いただければ、私がやろうとしていることはより明確になると思います。 編集:これは、より明確にするために2番目の呼び出しに遅延が追加された同じスクリプトです。
javascript - jQuery Deferred の $.when() および fail() コールバック引数
$.when()
遅延操作の 1 つが成功しない場合に使用すると、予期しない結果が得られます。
2 つの deferred を作成したこの JavaScript を見てください。1 つ目は成功し、2 つ目は失敗します。
自分で実行してください: http://jsfiddle.net/r2d3j/2/
私は得るfail! f1, f2: ["456 from f2", null]
問題は、.fail()
コールバックで、拒否で渡された値がf2()
最初の引数にルーティングされていることf1Value
です。つまり、どの遅延オブジェクトが実際にそれを投稿したかを知る方法が実際にはありません。reject()
また、失敗データが実際にどの操作に属しているかもわかりません。
最初の deferred が失敗しなかったので、.fail()
引数を取得すると予想していました。null, '456 from f2'
それとも、ここで遅延処理を正しく行っていないだけですか?
コールバックの引数の順序が守られていない場合、失敗した deferred と、どの拒否引数が失敗した deferred に属しているかを知るにはどうすればよいですか?
jquery - モナドの呪文で JQuery Deferred を呼び出す
JavaScript での Promises の使用に関するこの(優れた) 議論に触発されて、「 Global storage」コードを使用するときにコールバック税の支払いを避けるために、Deferred を使用して非同期関数と非非同期関数を連鎖させる方法を考え出そうとしています。
これに関連していくつか質問がありますが、文脈は同じなのでここでまとめて質問します。
私がうまくいかないことの 1 つは、非同期ではないものからどのように deferred を作成できるかということです。つまり、どのように値を取得し、promise でラップして、直接返すのでしょうか? ( a -> M<a>
)
また、非同期関数をラップして結果を直接返すようにするにはどうすればよいですか? ( (a -> b) -> (a -> M<b>)
)
最後の質問です。モナド フリークの方へ - この関数の標準名はありますか?[a] -> (a -> M<b>) -> M<[b]>
jquery - すべての遅延オブジェクトが解決されたら、jquery deferred.then() を発生させます
私は2つのjavascript関数を持ってsave()
おりsaveAll()
、以下のように設定されています:
saveAll()
jquery 遅延オブジェクトを活用し、すべての操作が完了したらcallback
関数を発生させるように変更することに興味があります。save()
ただし、正確な構文はわかりません...特に $.when() 内の $.each() に関連しています。このようなものでしょうか?