0

私はそれが完全に機能するこのコードを持っています:

$.getJSON('/admin/get_acronyms', function(data) {
    //load JSON
    $.each(data, function(key, val) {
        if(key === 'error') {
            alert(val);
        } else {
            //Update typeahead source
            autocomplete.data('typeahead').source = val;
        }
    });
});

そして、コードを再利用するために、この関数内で最小化したいと思います。

var getAndAppendJSON = function(url) {
    var result;
    $.getJSON(url, function(data) {
        $.each(data, function(key, val) {
            return val;
        });
    });
};


var arr = getAndAppendJSON('/admin/get_acronyms');
autocomplete.data('typeahead').source = arr;

しかし、この関数は機能しません:(。

JSコンソールはvararrが未定義であることを示しています

誰もが理由を知っていますか?前もって感謝します。

4

2 に答える 2

4

getAndAppendJSON実際には何も返しません。呼び出しが完了した後に完了するAJAX呼び出しを開始します。あなたがすべきことは、コールバック内で返されたデータを使用することです:

var getAndAppendJSON = function(url) {
    var result;
    $.getJSON(url, function(data) {
        autocomplete.data('typeahead').source = data;
    });
};

サーバーにアクセスして戻るには、リクエストに少し時間がかかります。これは、不確定な期間の後にデータが返されたときにデータを処理できるようにするためのハンドラーの目的です。

于 2013-03-19T23:31:57.757 に答える
3

AJAXは「非同期」であるためです。AJAXサクセスハンドラーが返さvalれますが、どこに戻りますか?

実行すると

var arr = getAndAppendJSON('/admin/get_acronyms');

AJAX呼び出しがサーバーに送信されていますが、その関数から何も返されていません。したがってarr、は未定義です。AJAX呼び出しがサーバーから返されるまでに、残りのJSは長い間進んでいます。

達成しようとしていることを実行するには、コールバック関数で割り当てを行う必要があります。

var getAndAppendJSON = function(url) {
    var result;
    $.getJSON(url, function(data) {
        autocomplete.data('typeahead').source = data;
    });
};
于 2013-03-19T23:31:39.513 に答える