Проблема со ссылкой на переменную в JavaScript - PullRequest
0 голосов
/ 30 июля 2011

Я пытаюсь отправить запрос и затем в функции обратного вызова изменить параметры и затем отправить запрос снова. Примерно так:

function sendRequest() {
    params = {param1:'value', param2:'value'};
    while(params) {
        $.getJSON("url", params, function(data) {
            if(data contains something important)
                params.foo = bar;
            else
                params = null;
        });
    }
}

Но params никогда не меняется, и цикл while продолжается вечно. Кажется, это проблема со ссылками; но я не могу понять, как это решить. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 30 июля 2011

Проблема в том, что getJSON является асинхронным.

  1. while(params) выполняется.Это правда, поэтому мы продолжаем
  2. $.getJSON называется.Переданная ему функция не будет вызываться в данный момент.Это просто поставлено в очередь к подсистеме, которая позже выполнит фактический запрос - асинхронно.
  3. while(params) выполняется снова.Обратный вызов, переданный на getJSON, еще не получил возможности для выполнения, поэтому params не изменился.
  4. Перейдите к шагу 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.

0 голосов
/ 30 июля 2011

'params' - переменная замыкания. Значение параметров изменяется позже в обратном вызове, когда поступает ответ асинхронного вызова ajax, но ваш цикл while удерживает механизм JS занятым, так что обратный вызов не будет вызываться никогда.

Либо вы можете продолжать вызывать одну и ту же функцию в ответном обратном вызове, либо вы можете использовать async: false вот так $.ajax({ async: false, ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...