我试图按顺序调用以下函数,但它们不一定按正确的顺序返回。
然后我学习了可以使用“回调”顺序调用的异步函数。
如何使用回调使这些函数按顺序执行?
$.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);
});
});
答案 0 :(得分: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();
});
});
答案 1 :(得分:0)
在此处查看我的问题:About Node's code style
我提供了一个辅助函数来进行在线调用的嵌入式回调。
它适用于NodeJS和浏览器JS。
答案 2 :(得分:0)
ajaxcall1(parameter, function() {
ajaxcall2(parameter, function() {
ajaxcall3(parameter, function() {
alert("lol");
};
};
});
说明:当第一个返回结果时调用第二个ajax调用,第二个返回时调用3d。
答案 3 :(得分:-1)
使用ajax async false选项
$.ajaxSetup({ async: false });
// put your three get methods here
$.ajaxSetup({ async: true });
注意:这将暂停您的动态页面功能,直到您的代码块执行完成