Проблема в том, что getJSON
является асинхронным.
while(params)
выполняется.Это правда, поэтому мы продолжаем $.getJSON
называется.Переданная ему функция не будет вызываться в данный момент.Это просто поставлено в очередь к подсистеме, которая позже выполнит фактический запрос - асинхронно. while(params)
выполняется снова.Обратный вызов, переданный на getJSON
, еще не получил возможности для выполнения, поэтому params
не изменился. - Перейдите к шагу 2.
Другими словами, вы создалибесконечный цикл, поскольку система, которая обрабатывает функцию обратного вызова из очереди, никогда не запускается из-за бесконечного цикла.Все, что вы в итоге делаете, - это создание бесконечно длинного списка вызовов getJSON
в очереди.
Лучшим решением будет что-то вроде этого:
function sendRequest(params) {
$.getJSON("url", params, function(data) {
if(data contains something important)
params.foo = bar;
sendRequest(params);
else
params = null;
// Probably do something like requestChainFinished(params);
});
}
sendRequest({param1:'value', param2:'value'});
Используя функцию, вы получаете контрольпотока и не выполняйте другой запрос до тех пор, пока не будет вызван асинхронный обратный вызов getJSON
.