-2

私は 30 回 ajax 呼び出しを作成しようとしていますが、これにより無限ループが発生します。それは確かにデータ配列に関連する範囲の問題ですが、それを追跡することはできません。

var data = [], totalPoints = 30;
function getData() {
    var value = 0.0;
    if (data.length > 0)
        data = data.slice(1);

    url = "some/url"

    while (data.length < totalPoints) {
        $.getJSON(url, {metric_name : "someMetric"})
         .done(function(json ) {
            value = json;
            console.log(value);
            data.push(value.metricValue);
         });
    }
}
4

1 に答える 1

2

呼び出しは非同期であるため、$.getJSON手続き型スキームに従うことはできません。低レベル$.ajaxを使用し、非同期オプションをfalse.

async (デフォルト: true) タイプ: ブール値 デフォルトでは、すべてのリクエストは非同期で送信されます (つまり、デフォルトで true に設定されています)。同期リクエストが必要な場合は、このオプションを false に設定します。クロスドメイン リクエストと dataType: "jsonp" リクエストは、同期操作をサポートしていません。同期リクエストはブラウザを一時的にロックし、リクエストがアクティブな間はすべてのアクションを無効にする場合があることに注意してください。jQuery 1.8 以降、jqXHR ($.Deferred) で async: false を使用することは推奨されなくなりました。jqXHR.done() や非推奨の jqXHR.success() などの jqXHR オブジェクトの対応するメソッドの代わりに、成功/エラー/完了のコールバック オプションを使用する必要があります。

参照: http://api.jquery.com/jQuery.ajax/

コード (テストされていません..):

var data = [],
    totalPoints = 30;

function getData() {
    var value = 0.0;
    if (data.length > 0) data = data.slice(1);

    url = "some/url"

    $.ajax({
        type: 'GET',
        url: url,
        dataType: 'json',
        success: function (json) {
            value = json;
            console.log(value);
            data.push(value.metricValue);
        },
        data: {
            metric_name: "someMetric"
        },
        async: false
    });
}
于 2013-09-17T21:03:59.150 に答える