以下是我的代码:
$(document).on("click",".ball_link", function makeDiv(){
function fetchLevels(){
$.getJSON('fetch_level.php',{level: clicked_ball}, function(data) {
$.each(data, function(i,name) {
alert(name.level_id); //Line 1
});
});
}
fetchLevels();
alert(name.level_id); //Line 2
while (//some condition){
alert("hi 2"); //Line 3
}
});
所需的执行顺序:
第1行
第2行(价值与第1行相同)
第3行
实际执行顺序:
第2行(值:未定义)
第3行
第1行(正确值)
如何控制这些行的执行顺序以获得具有正确值的所需行?
答案 0 :(得分:3)
由于ajax调用是异步的,您可以移动成功回调中的所有代码,也可以使用延迟对象来处理正确的执行顺序
function fetchLevels() {
$.getJSON('fetch_level.php', { level: clicked_ball })
.done(function(data) {
$.each(data, function(i,name) {
alert(name.level_id); //Line 1
});
alert(name.level_id); //Line 2
while (//some condition) {
alert("hi 2"); //Line 3
}
});
}
fetchLevels();
或者你可以使用这个
function fetchLevels() {
return $.getJSON('fetch_level.php', { level: clicked_ball })
}
$.when(fetchLevels()).done(function(data) {
$.each(data, function(i,name) {
alert(name.level_id); //Line 1
});
alert(name.level_id); //Line 2
while (//some condition) {
alert("hi 2"); //Line 3
}
});
})
答案 1 :(得分:1)
通常情况下,您可以调用.ajax并使用success命令进行处理,例如:
$.ajax({
url: myUrl,
dataType: 'json',
data: myData,
success: function(data) {
// do stuff here.
}
});
如果确实需要按照您的建议进行编码,则可以使用async: false
,例如:
$.ajax({
url: myUrl,
dataType: 'json',
async: false,
data: myData,
success: function(data) {
// set variable here, then work with it outside the function
}
});
答案 2 :(得分:0)
将第2行和第3行放在$.getJSON
回调中,否则第1行在回调完成后异步执行,而其余的则同步执行。
答案 3 :(得分:0)
getJSON
是异步的。在加载后你想要发生的一切都需要在回调中:
$(document).on("click", ".ball_link", function makeDiv() {
$.getJSON('fetch_level.php', {
level: clicked_ball
}, function (data) {
$.each(data, function (i, name) {
alert(name.level_id); //Line 1
});
fetchLevels();
alert(name.level_id); //Line 2
while ( //some condition){
alert("hi 2"); //Line 3
}
});
});