... петля, похоже, не ждет завершения ajax.
Нет, потому что "а" в "Аякс" означает асинхронных; это не происходит, когда вы совершаете вызов, это происходит позже. Но нет причин, по которым петля $.each
знала, чтобы сидеть и ждать, пока она закончится.
Если вам это не нужно (например, для вызовов ajax накладываться нормально, что обычно должно быть, если они не полагаются друг на друга), look at Rocket Hazmat's approach.
Если вам нужен каждый вызов ajax, ожидающий окончания предыдущего, вы не сможете использовать $.each
(или, по крайней мере, не так, как вы были); вместо этого использовать индекс и реагировать на обратный вызов, вызывая следующий запрос:
// Start with first entry
var index = 0;
var array = data['Result'][0];
// Do the first request
doRequest();
function doRequest() {
var value = array[index];
InputGen(value['Type'], value['Name'], value['Other'], value['Value'], function(Html) {
Table = Table + "<tr><td>"+index+"</td><td>" + Html + "</td></tr>";
// This request is done, move to the next if any
if (++index < array.length) {
doRequest();
}
});
}
Side Примечание: Всецело в JavaScript, переменные и функции без конструктора названы, начиная с строчной буквы: value
а не Value
и т. д. Поэтому я использовал index
, array
и value
выше.
Боковое примечание 2: value['Type]
можно более просто написать как value.Type
. (И так далее.)
Вам понадобится какая-то система ожидания или обещания. –
AJAX - * асинхронный *. Ничто не собирается * ждать *, чтобы закончить. Обратный вызов будет запущен в будущем в какой-то момент, когда вызов будет выполнен. К тому времени ваш '$ .each' (и код после) уже давно сделан. –