Обратный вызов success
от вашего основного вызова $.ajax
выглядит следующим образом:
success: function(data) {
var tableDataA = '<table border="0" width="500">';
$.each(data, function(i, detail) {
$.getJSON("webService2", function(metaData) {
// ...
});
});
tableDataA = tableDataA + '</table>';
$('#tableData').empty();
$('#tableData').append(tableDataA);
}
Каждый из ваших вызовов $.getJSON
является асинхронным, поэтому функции обратного вызова, которые создают tableDataA
, не будутвыполняется до тех пор, пока не завершится обратный вызов success
.Это означает, что когда вы достигаете дна обратного вызова success
, вы просто делаете это:
$('#tableData').empty();
$('#tableData').append('<table border="0" width="500"></table>');
и вы получаете пустую таблицу.Позже, когда вызовы $.getJSON
завершатся, они добавят некоторые данные в tableDataA
, но будет слишком поздно, никто не будет заботиться о том, что находится в tableDataA
на этом этапе.
Вы можете заменить свой $.getJSON
звонков с синхронными $.ajax
звонками, но ваши пользователи будут вас ненавидеть за это.
Вы можете создать всю пустую таблицу в вашем success
обратном вызове итогда ваши $.getJSON
обратные вызовы будут просто заполнять пробелы чем-то вроде этого в вашем success
обратном вызове:
var tableDataA = '<table border="0" width="500">';
for(var i = 0; i < data.length; ++i)
tableDataA += '<tr><td></td><td></td><td></td><td></td></tr>';
tableDataA += '</table>';
$('#tableData').empty();
$('#tableData').append(tableDataA);
$.each(data, function(i, detail) {
$.getJSON('webService2', function(metaData) {
$tr = $('#tableData table tr:eq(' + i + ')');
// Fill in the table cells in $tr
});
});
Если возможно, было бы лучше объединить две службы в одну, что даст вамвесь BLOB-объект JSON, который вам нужен за один раз.Если у вас нет контроля над удаленными системами, то вышеуказанный подход «заполнить пробелы» может быть самым простым.