2

次の関数を順番に呼び出そうとしていますが、必ずしも正しい順序で返されるとは限りません。

次に、「コールバック」を使用して順次呼び出すことができる非同期関数について学びました。

コールバックを使用してこれらの関数を順番に実行するにはどうすればよいですか?

$.getJSON('http://localhost/search_data.php?title='+title+'&run=annotations&jsoncallback=?', function(r1){
    $.each(make_all_titles3(r1), function (i,v) {
        $vpl.append(v);     
    });
});

$.getJSON('http://localhost/search_data.php?title='+title+'&run=Link&jsoncallback=?', function(r2){
    $.each(make_all_titles3(r2), function (i,v) {
        $vpl.append(v);     
    });
});

$.getJSON('http://localhost/search_data.php?title='+title+'&user='+user+'&run=bookmarks&jsoncallback=?', function(r3){
    $.each(make_all_titles3(r3), function (i,v) {
        $vpl.append(v);     
    });
});

$vpl.append('<div>Related Terms</div>');

$.getJSON('http://localhost/context-search.php?title='+title+'&jsoncallback=?', function(r4){
    $.each(make_all_titles3(r4), function (i,v) {
        $vpl.append(v);     
    });
});
4

4 に答える 4

2

最も簡単な解決策は、単に呼び出しをネストすることです。下にスクロールして、クリーンで読みやすいソリューションを見つけてください。

function _process(r) {
    $.each(make_all_titles3(r), function (i, v) {
        $vpl.append(v);
    });
}

$.getJSON('http://localhost/search_data.php?title=' + title + '&run=annotations&jsoncallback=?', function (r) {
    _process(r);
    $.getJSON('http://localhost/search_data.php?title=' + title + '&run=Link&jsoncallback=?', function (r) {
        _process(r);
        $.getJSON('http://localhost/search_data.php?title=' + title + '&user=' + user + '&run=bookmarks&jsoncallback=?', function (r) {
            _process(r);
            $vpl.append('<div>Related Terms</div>');
            $.getJSON('http://localhost/context-search.php?title=' + title + '&jsoncallback=?', function (r) {
                _process(r);
            });
        });
    });
});

asyncこれで、ライブラリを使用して、クリーンで読みやすいものになりました。

var load = [
    { url: 'http://localhost/search_data.php?title=' + title + '&run=annotations&jsoncallback=?', before: null },
    { url: 'http://localhost/search_data.php?title=' + title + '&run=Link&jsoncallback=?', before: null },
    { url: 'http://localhost/search_data.php?title=' + title + '&user=' + user + '&run=bookmarks&jsoncallback=?', before: null },
    { url: 'http://localhost/context-search.php?title=' + title + '&jsoncallback=?', before: function() { $vpl.append('<div>Related Terms</div>'); } }
];

async.forEachSeries(load, function(item, next) {
    if(item.before) {
        item.before();
    }
    $.getJSON(item.url, function(r) {
        $.each(make_all_titles3(r), function (i, v) {
            $vpl.append(v);
        });
        next();
    });
});
于 2012-05-18T11:35:29.303 に答える
0

ここで私の質問を参照してください:ノードのコードスタイルについて
そして私はインラインで呼び出される埋め込みコールバックを作成するためのヘルパー関数を提供します。
NodeJSとブラウザJSの両方で機能します。

于 2012-05-18T11:36:35.767 に答える
0
ajaxcall1(parameter, function() {
    ajaxcall2(parameter, function() {
        ajaxcall3(parameter, function() {
            alert("lol");
        };
    };
});

説明:最初の呼び出しが結果を返すときに2番目のajax呼び出しを呼び出し、2番目が戻るときに3dを呼び出します。

于 2012-05-18T11:37:27.043 に答える
-1

ajaxasyncfalseオプションを使用する

$.ajaxSetup({ async: false });
    // put your three get methods here
$.ajaxSetup({ async: true });

注:これにより、コードブロック全体の実行が完了するまで、動的ページの機能が停止します。

于 2012-05-18T11:29:45.280 に答える