Я создал массив вне цикла и добавил его значение внутри цикла, чем я не могу использовать его вне цикла. вот мой код, помогите мне.
$(document).ready(function() { var usr_id = $("#user_id").val(); var tabs_name = new Array("full_body", "hand_uper_limb", "lower_trunk" , "spine" , "upper_trunk") ; var tab_order = new Array(); $.each(tabs_name , function(value) { $.ajax({ method: "POST", url: "kv_load.php", data: { id: usr_id, tbl_name : 'kv_'+tabs_name[value]}, success: function(response) { if(response == null || response =="" ) { } else { var obj = jQuery.parseJSON(response); ax = jQuery.parseJSON(obj.x_coordinate); if (ax!==null && ax.length!== 0) { var len_x =ax.length; } else { len_x = 0 ; } tab_order.push({ table: tabs_name[value], size: len_x }); } }, failure: function() { alert('failed to save your datas. '); } }); }); $.each(tab_order, function (index, value) { alert( value.table + ' : ' + value.size ); }); });
Здесь "tab_order" - это моя переменная массива, я объявлял ее с начала dom ready, и добавляю элементы внутри каждой функции, после чего я выхожу для печати массива, но это приводит к пустым. Если вы не поняли, скажите мне, что я объясню подробно.
Спасибо за все ваши ответы. Наконец, моя проблема решена здесь. с ниже ответами,
попробуйте его для разрешения
$(document).ready(function() {
var usr_id = $("#user_id").val();
var tabs_name = new Array("full_body", "hand_uper_limb", "lower_trunk" , "spine" , "upper_trunk") ;
var tab_order = new Array();
$.each(tabs_name , function(value) {
$.ajax({
method: "POST",
url: "kv_load.php",
data: { id: usr_id, tbl_name : 'kv_'+tabs_name[value]},
success: function(response) {
if(response == null || response =="" ) { } else {
var obj = jQuery.parseJSON(response);
ax = jQuery.parseJSON(obj.x_coordinate);
if (ax!==null && ax.length!== 0) {
var len_x =ax.length;
} else {
len_x = 0 ;
}
tab_order.push({ table: tabs_name[value], size: len_x });
// if all responses have now been received,
// the results are all here and can now be processed
if (tab_order.length === tabs_name.length) {
var deferred = $.Deferred();
$.each(tab_order, function (index, value) {
alert( value.table + ' : ' + value.size );
});
deferred.resolve();
deferred.promise().done(function(){tab_order=[]});
}
}
},
failure: function() {
alert('failed to save your datas. ');
}
});
});
});
пожалуйста, посмотрите на изображение.
С асинхронными ответами (которые вы получаете с вызовами Ajax), вы должны выполнить всю обработку данных ответа в обработчике завершения для вызова ajax. Если вы хотите подождать до тех пор, пока все вызовы ajax не будут выполнены до обработки всех результатов, тогда вы должны проверить каждый обработчик завершения, если это последний, и если да, то выполните обработку данных. Таким образом, независимо от времени ответа ajax, вы узнаете, что все они теперь сделаны.
Не используйте async: false
с вашими вызовами Ajax. Это заблокирует браузер (он не обрабатывает никаких событий или не запускает какой-либо javascript), пока выполняется вызов ajax. Это не будет хорошим пользовательским интерфейсом и даже хуже в медленных сетях или если сервер не реагирует. Правильное асинхронное программирование не требует установки async: false
.
Здесь один из способов решить проблему путем проверки в каждой функции завершения Ajax, если все результаты были собраны сейчас (например, последний вызов Ajax завершен). Если да, то обрабатывайте результаты. Вот как выглядит этот код:
$(document).ready(function() {
var usr_id = $("#user_id").val();
var tabs_name = new Array("full_body", "hand_uper_limb", "lower_trunk" , "spine" , "upper_trunk") ;
var tab_order = new Array();
$.each(tabs_name , function(value) {
$.ajax({
method: "POST",
url: "kv_load.php",
data: { id: usr_id, tbl_name : 'kv_'+tabs_name[value]},
success: function(response) {
if(response == null || response =="" ) { } else {
var obj = jQuery.parseJSON(response);
ax = jQuery.parseJSON(obj.x_coordinate);
if (ax!==null && ax.length!== 0) {
var len_x =ax.length;
} else {
len_x = 0 ;
}
tab_order.push({ table: tabs_name[value], size: len_x });
// if all responses have now been received,
// the results are all here and can now be processed
if (tab_order.length === tabs_name.length) {
$.each(tab_order, function (index, value) {
alert( value.table + ' : ' + value.size );
});
}
}
},
failure: function() {
alert('failed to save your datas. ');
}
});
});
});
Кроме того, в jQuery можно использовать функции отложенных/обещаний, чтобы помочь нам получить уведомление, когда несколько асинхронных операций завершены следующим образом:
$(document).ready(function() {
var usr_id = $("#user_id").val();
var tabs_name = new Array("full_body", "hand_uper_limb", "lower_trunk" , "spine" , "upper_trunk") ;
var tab_order = new Array();
var promises = [];
$.each(tabs_name , function(value) {
var jqXHR = $.ajax({
method: "POST",
url: "kv_load.php",
data: { id: usr_id, tbl_name : 'kv_'+tabs_name[value]},
success: function(response) {
if(response == null || response =="" ) { } else {
var obj = jQuery.parseJSON(response);
ax = jQuery.parseJSON(obj.x_coordinate);
if (ax!==null && ax.length!== 0) {
var len_x =ax.length;
} else {
len_x = 0 ;
}
tab_order.push({ table: tabs_name[value], size: len_x });
}
},
failure: function() {
alert('failed to save your datas. ');
}
});
promises.push(jqXHR);
});
$.when.apply($, promises).done(function() {
$.each(tab_order, function (index, value) {
alert( value.table + ' : ' + value.size );
});
});
});
Asynchronous
вы можете установитьasync : false