0

私はグーグルアプリエンジンを使用して私の特定のプロジェクトを実行しています。リクエストには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関数を繰り返し呼び出しますか?これを行うためのより良い方法がある場合は、説明を提供してください。
4

1 に答える 1

2

次のように、パイプを再帰的に使用できます。

function myFetch( id ) {
    return $.ajax({
        url: serviceURL,
        data: {
            id: id,
            someOthers: data
        }
    }).pipe(function( data ) {
        saveData( data );
        if ( !isOK( data ) ) {
            return myFetch( id );
        }
    });
}

ajaxリクエストは一度だけ定義され、パイプハンドラーで条件付きで再発行します。

于 2012-01-30T13:22:17.067 に答える