問題タブ [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.

0 投票する
6 に答える
32383 参照

jquery - jqueryを使用してajax呼び出しをチェーンする方法

ブラウザをロックせずに一連のNajaxリクエストを行う必要があり、これを実現するためにjquery遅延オブジェクトを使用したいと思います。

これは3つのリクエストを含む単純化された例ですが、私のプログラムは100を超えるキューを作成する必要がある場合があります(これは正確なユースケースではないことに注意してください。実際のコードは、次の実行前にステップ(N-1)の成功を確認する必要があります。ステップ):

コンソールに書き込まれる内容は次のとおりです(すべての要求は並行して行われ、応答時間は予想どおり各国のデータのサイズに正比例します。

延期されたオブジェクトにこれらをキューに入れるにはどうすればよいですか?パイプに変更を加えてみましたが、同じ結果が得られます。

望ましい結果は次のとおりです。

編集:

配列を使用してリクエストパラメータを保存するという提案に感謝しますが、jqueryの遅延オブジェクトにはリクエストをキューに入れる機能があり、この機能を最大限に活用する方法を学びたいと思っています。

これは事実上私がやろうとしていることです:

ただし、各トラバーサルを効果的に使用するために、一度に1ステップずつパイプにリクエストを割り当てたいと思います。

0 投票する
1 に答える
1676 参照

dojo - Dojo Deferred チェーニング

次のシナリオで Dojo Deferred を機能させる方法について頭を悩ませています。基本的に、いくつかのアイテムをループし、各アイテムを個別に遅延処理する関数があります。各アイテムの処理は、完了時に Deferred を返す個別のメソッドで実行されます。ループを実行して各アイテムを処理し、完了時に成功または失敗を報告できるようにしたいと考えています。テストサンプルとしてこれまでに得たものは次のとおりです。

http://jsfiddle.net/Ayyoudy/mgv6Y/12/

私は何を間違っていますか?出力番号が順番に並んでいることを期待していますが、そうではありません。

また、アイテムの 1 つを処理中にエラーが発生したかどうかを検出し、エラーが発生した場合は残りを処理しないようにしたいと考えています。

ありがとう

0 投票する
2 に答える
956 参照

jquery - 複数の遅延Ajax通話からのデータと発信者のペアリング

私は複数の延期されたAjax呼び出しを処理しており、それらのデータへのアクセス方法について動的になりたいと思っています。いくつかのパラメーターを.thenコールバックにハードコーディングしてそれぞれを個別に使用するのではなく、argumentsオブジェクトをループしてデータにアクセスしたいと思います。これは正常に機能しますが、jsonからどのデータがどのAjax呼び出しからのものであるかを判別できない場合を除きます。これは、promiseオブジェクトから(何らかの方法で)URLを決定するか、Ajax呼び出しが実行された順序を把握し、データが同じ順序であると想定することで解決できます。

これまでの私のコードは次のとおりです(私がやろうとしていることを説明するためにモックアップされています):

各引数をそれを生成したAjax呼び出しと一致させる別の方法はありますか?私がしたくないのはこれです:

ありがとう!サラ

0 投票する
1 に答える
2853 参照

dojo - Dojo JSONP 要求の後、応答はどこに保管されますか?

JavaScript

たとえば、次の JavaScript コードがあります (Dojo 1.6 は既にロードされています)。

ブラウザからの直接クエリ

アドレス バーに次のように入力したかのように、サーバーがクエリを受信することを理解しています。

期待される反応

ブラウザーのアドレス バーを使用してサーバーに直接クエリを実行すると、application/jsonブラウザーでレンダリングされた MIME タイプとプレーンテキストで、次のようなメッセージが表示されます。

問題

さて、JavaScript のパート II を振り返ると、JSONP リクエストをdojo.io.script.get(jsonpArgs). これはオブジェクトを返します。このオブジェクトは、その後にDeferredチェーンすることで利用できます.then。イベントのハンドラーを定義して.then、キャプチャーdataしたものをコンソールに出力することに注意してください。

ただし、コンソールに表示されるのはEvent. そのデータ ツリーを検索しようとしましたが、期待したデータが見つかりませんでした。

質問

  1. JSONP リクエストのレスポンスはどこに保存されますか? どうすれば見つけられますか?
  2. 私のサーバー (私が管理) は、要求されたデータのプレーンテキスト レンダリングのみを出力し、callback関数 (ここでは として指定) でラップし、 MIME タイプrecoverを指定します。application/json応答データがオブジェクトによってキャプチャされるように、サーバーに設定する必要があるものは他にありDeferredますか?

試みられた解決策

コールバック関数を定義することで、実際に応答を回復できます (この場合recoverは、JavaScript のパート III にあります)。ただし、Dojo チュートリアルでは、Deferred(および.then) フレームワークを使用してデータを復元しただけです。Dojo を使用してどのように行うDeferredのですか?

更新 (Dojo チュートリアルの Twitter の例を使用)

たとえば、Dojo チュートリアルGetting Jiggy With JSONPのこのスクリプトを取り上げます。データをコンソールに記録するように編集しました。

の場合、私のケースで示されているように ではなく、console.log(data)が得られます。この例は、データが にあることを暗示しているため、このツリーもブラウズしようとしましたが、Twitter から期待したデータが表示されません。私は途方に暮れています。ObjectEventdata.results

の場合、s のconsole.log(data.results)配列を取得しObjectます。Twitter に直接クエリを実行すると、これがプレーンテキストで取得されます。それぞれObjectには、ユーザー名、時間、ユーザーのポートレート、ツイート自体など、通常のツイート メタデータが含まれています。簡単です。

これは私の頭を直撃します。.then匿名関数であるチェーンのハンドラーは、引数を 1 つだけ受け取りますdata。しかし、resultsプロパティconsole.log(data) 返されたオブジェクトconsole.log(data.results)異なるのはなぜですか?

0 投票する
1 に答える
2460 参照

python - Python Twisted Deferred:説明が必要

「最初の」遅延を処理するための最良の方法、つまり、遅延を返す既存のツイストメソッドにコールバックとエラーバックを追加するだけでなく、それらの元の遅延を作成するための最良の方法について、いくつかの説明を期待しています。

具体的な例として、同じ方法の2つのバリエーションを示します。これは、かなり大きなテキストファイルの行数をカウントするだけで、一連の遅延の開始点として使用されます。

方法1: 遅延はreactor.callLaterメソッドによって直接実行されるため、これはあまり気分が良くありません。

方法2:結果が利用可能になったときに 遅延が実際に発生するため、わずかに優れています

注:これらは両方とも実際には同期的であり、潜在的にブロックするメソッドであることを指摘することもできます(おそらく、「MaybeDeferred」を使用できますか?)。しかし、それは実際に私が混乱する側面の1つです。

  1. 方法2の場合、count_linesメソッドが非常に遅い場合(いくつかの巨大なファイルの行を数えるなど)、Twistedアプリ全体を「ブロック」する可能性がありますか?コールバックとエラーバックとreactorがどのように一緒に動作するか(コールバックをすばやく実行するか、遅延を返す必要があるなど)に関するドキュメントをたくさん読みましたが、この場合、私は見ていません。例など

  2. これらの「最初の」延期を作成するための最良のアプローチを扱った記事/明確な説明はありますか?私はこれらの優れた記事を読み、基本的な理解の一部に大いに役立っていますが、それでも私は作品が欠けているように感じます。

  3. コードをブロックする場合、これはDeferToThreadまたはreactor.spawnprocessの一般的なケースですか?私はこの記事やこの記事のような多くの質問を読みましたが、主にファイルi / oを処理するときに、潜在的にブロックされているコードを処理する方法について100%確信がありません。

これのどれかがあまりにも基本的であるように思われるならば申し訳ありませんが、私は本当にツイストをもっと徹底的に使うコツをつかみたいです。(これは、ネットワーク指向のすべての側面にとって非常に強力なツールです)。お時間をいただきありがとうございます!

0 投票する
2 に答える
2946 参照

javascript - jQuery またはプレーン JS: イベント リスナーが返された後に関数を実行する

barelement に" " という名前のイベントがあるとします#foo

リスナーがイベントをキャンセルするbarかどうかに関係なく、jQuery 遅延オブジェクトを使用して、イベント リスナーが実行された (返された)直後に関数を強制的に実行する方法はありますか?bar

それとも、これにはjQueryさえ必要ないのでしょうか?

編集: 明確にするために、barハンドラー内から別のイベントまたは関数をトリガーすることは、私が探しているものではありません。barハンドラーはまだ返されていないため、「そのbarイベントの後」ではありません。IE 8 の非常に具体的な問題/バグに対処しようとしているため、この質問は奇妙で意味がないように思えるかもしれません。

このようなものが必要です:

0 投票する
1 に答える
226 参照

jquery - Google App Engine +jqueryajax遅延+カーソル

私はグーグルアプリエンジンを使用して私の特定のプロジェクトを実行しています。リクエストには30秒の制限があるため、カーソルとmemcacheを使用してデータフェッチプロセスを抑制します。

問題文:

  1. 私はajax呼び出しログを持っています。これは基本的に、サーバーから必要なすべての詳細のリストであり、ユーザーとの対話によって作成されます。
  2. 通話ログの各ajax通話にはデータが含まれている可能性があり、30秒の制限に達する可能性があります。だから私はそれを分解して部分的に返す必要があります。
  3. ログ内のすべての呼び出しが完了したら、戻りデータに基づいてカスタムロジックを実行する必要があります。

今、私はすでにこのように機能するソリューションを持っています:

  1. ランダムな識別子を使用して最初のajax呼び出しを開始します
  2. 戻ったら、いくつかのパラメータをチェックして、必要なすべてのデータが取得されているかどうかを確認します。
  3. そうでない場合は、手順1と同じランダム識別子を使用して呼び出しを再度実行します+これまでにフェッチされたデータを保存します
  4. はいの場合、ログからアイテムを削除し、次のアイテムに対して手順を繰り返します

ただし、このコードはすべて、現在ajax呼び出しの成功イベントで処理されています。私はjQueryDeferredsについて読みましたが、現在採用されている凶悪なコードを修正するのは本当に良い候補のようです。

私はすでに次のことを理解しています:

  1. $.when.apply(null, arrayOfDeferreds)ある種の動的呼び出しリストを作成するために使用します-jQuery.whenを読み取ります
  2. これで、deferred.done関数を使用して、呼び出しごとにデータダンプを保存できます
    。問題は、要求を再度呼び出す必要がある場合は、ajax要求を解決しないことをdeferredに伝える方法です。保存するだけです。データを取得し、最初の呼び出しと同じランダムな識別子を使用して呼び出しを再実行しますか?つまり、基本的に、すべてのデータが保存されるまで、done関数を繰り返し呼び出しますか?これを行うためのより良い方法がある場合は、説明を提供してください。
0 投票する
2 に答える
1109 参照

jquery - jQuery - 不明な数の Ajax リクエストの結果を連結する

これは非常に単純な場合もあれば、非常に複雑な場合もありますが、現時点ではわかりません。

私は、Cineworld API に基づいて映画館のスケジュールを実行する小さな Web アプリを作成しています。

私は AJAX を使用してデータをプルバックしていますが、それで問題ありませんが、選択したすべての映画のすべての時間を取得し、後でそれらを操作したいところまで来ましたが、すべての結果を組み合わせると少し問題があることを証明します。

結果として得られる API 呼び出しは 1 つの映画でしか実行できないため、各映画のデータを順番に取得する必要があります。

アプリの現在の非常に初期の状態は、http: //www.lewishowles.co.uk/film/で確認できます。

主な内臓は次のファイルにあります: http://www.lewishowles.co.uk/film/js/lh.js

42206私の問題です。42常に空の配列をログに記録しますが、206毎回配列をログに記録しても問題ありません。ただし、ロギングは明らかにあまり役に立ちません。ログオン42は、その上の関数のすべてのコードが完了するのを待っていないようです。

ご覧のとおり、グローバル配列を試してみましたが、値を返そうとしましたが、それでもログの実行が速すぎるようです。

Deferred は通常そうであるように見えますが、毎回異なる数の ajax 呼び出しがあり、Deferred を使用する回数を知る必要があるようです。

async を false に設定すると、それらが互いにつまずくのを止めましたが、それはこの状況を助けていません。

私が考えることができる2つのことは、セッションストレージを使用するか、後でアクセスする必要があるHTMLのどこかに各ループの結果を隠すことですが、どちらも同じ問題を起こしやすいようです.

もう 1 つのアイデアは、別のボタンを押してデータをロードする時間を確保することですが、これは別のステップを追加するものであり、理想的ではありません。

何か案は?

0 投票する
3 に答える
8028 参照

javascript - ライブラリがすべての例外を飲み込んでいる場合、非同期の promise ベースのコードをデバッグするにはどうすればよいですか?

問題

JSFiddle : http://jsfiddle.net/missingno/Gz8Pe/2/

次のようなコードがあります。

問題は、私が IE を使用しているとき、対応する行番号への参照がなく、デバッガーが問題のある行で停止することなく、'obj' is null or not an objectエラーしか表示されないことです (私が望むように)。

この種の問題は、コードをデバッグするのが面倒であり、私が今考えることができる唯一の解決策 (制御フロー ライブラリをいじるか、デバッガーまたは console.log を使用した段階的なデバッグに頼る) は、私が考えることです。むしろしなくていい。

何が起こっていると思いますか

チェーンが起動された後にエラーバックを追加できるようにするためにthen、コールバックによってスローされた例外を事前にキャッチします。これが、IE デバッガーがエラーで停止しないか、行番号を含む通常のエラー メッセージを表示する理由だと思います。

行番号のないエラー メッセージは、制御フロー ライブラリからのものです。これはdeferredOnError、例外がキャッチされて後で使用できるように保存されるたびに呼び出されるフックを提供します。デフォルトの動作は、Error オブジェクトを console.error-ing することです。

悲しいことに、IE のエラー オブジェクトから行番号またはスタック トレースを取得する方法がわかりませんでした。また、例外を再スローしてトップレベルまでバブルアップさせることができない方法でフックが呼び出されました。

私が欲しいもの

非同期コードをデバッグしてから、デバッガーを段階的に使用するより良い方法が必要です。最良の場合、デバッガーを例外で停止させる方法(未処理の例外の場合と同様) 、または少なくとも、スローされた Error オブジェクトから行番号またはスタック トレースを取得する方法。

0 投票する
2 に答える
370 参照

javascript - $.when.doneにajaxリクエストを行う関数を渡す

その場でajaxリクエストを生成したいのですが、すべて完了した後にコールバックを確実に取得したいので、次のような.when.doneステートメントでラップしたいと思います。

ここで、私のオプションは、同時に作成したい各ajaxリクエストのファイルパスとデータ型を含むオブジェクトの配列です。このコードは成功を返しますが、引数は単なる関数であり、ajaxリクエストは通過しません。これを行う方法について何か考えはありますか?