1

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

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

何か案は?

4

2 に答える 2

1

多数の ajax 呼び出しを開始し、すべての呼び出しがいつ完了したかを知りたい場合、それを行う方法はいくつかあります。

最も単純な方法は、実行中の ajax 呼び出しの数のカウンターを保持することです。次に、それぞれが終了したら、(成功ハンドラーで) カウンターをデクリメントし、カウンターがゼロになったら、すべてのデータが利用可能になったときに実行する関数を呼び出します。

疑似コードでは、非同期の ajax 呼び出しに対して次のように機能します。

function runAjaxRequests(listOfRequests) {
    var ajaxCntr = listOfRequests.length;
    var ajaxResults = [];

    // fire off all the ajax requests
    for (var i = 0; i < listOfRequests.length; i++) {
        $.ajax(..., function(data) {
            // ajax success handler

            // store data returned from this request into ajaxResults
            ajaxResults.push(...);

            // see if all ajax requests are now done
            --ajaxCntr;
            if (ajaxCntr == 0) {
                // all data has been returned, we can process it now
                processAllAjaxData(ajaxResults);
            }
        })
    }
}
于 2012-02-05T04:14:46.073 に答える
0

同様のユースケースがありました。async:falseそして、すべての結果を親変数に作成して追加することでそれを達成しました。以下のコードをチェックしてください。

            fileArr = ['1.csv', '2.csv']
            var csvObjArr = []
            for (var i in fileArr) {
                $.ajax({
                    type : "GET",
                    url : _default_base_dir + fileArr[i],
                    dataType : "text",
                    async: false,
                    success : function(data) {
                        // Appending every results in csvObjArr
                        csvObjArr = csvObjArr.concat($.csv.toObjects(data));
                    }
                }); 
            }
            //At this point all ajax are completed
            processData(csvObjArr)

警告このコードは、次々と ajax 呼び出しを行います。不要な処理が遅くなる可能性があるため、考慮する必要があります。HTH

于 2016-02-06T05:45:38.123 に答える