Javascript пустой цикл - PullRequest
       2

Javascript пустой цикл

4 голосов
/ 11 февраля 2011

Я видел такой код:

while(ajaxCallInProgress)
        {
        }
        ajaxCallInProgress = true;

Какая польза от этого пустого цикла в javascript? Что это делает? Заранее спасибо ...

Ответы [ 7 ]

5 голосов
/ 11 февраля 2011

, если ajaxCallInProgress является истинным выражением, это будет бесконечный цикл (и, следовательно, заморозит интерпретатор навсегда).

Во многих местах имеет смысл что-то делать, хотя определенное условие истинно, но во всех этих случаях проверяемое условие должно в какой-то момент устанавливать значение falsy в теле цикла.

Поскольку ECMA- / Javascript не поддерживает несколько потоков (я здесь просто игнорирую веб-работников), эта переменная не может быть изменена где-то еще.

Заключение

Где бы вы ни видели этот код, вы либо не копировали и не вставляли его полностью, либо автор этого кода на самом деле не знал, что он делает.

2 голосов
/ 11 февраля 2011

Это происходит бесконечно, пока ajaxCallinProgress не станет false.Хотя он зацикливается, он потребляет столько ресурсов процессора, сколько может сделать один поток.

Я думаю, что это очень плохой пример выполнения операции блокировки, лучший способ обработки чего-то асинхронного - это события.

Надеюсь, это помогло.

1 голос
/ 12 марта 2012

Код создает спин-блокировку. Этот код будет вращаться и ничего не делать, пока он ожидает, пока обработчик события не изменит значение ajaxCallInProgress. Предположительно, Ajax-запрос был отправлен на сервер, и этот код ожидает ответа, а обработчик событий ожидает, пока этот ответ изменит значение ajaxCallInProgress, после чего этот код продолжит работу.

1 голос
/ 11 февраля 2011

Похоже, это код блокировки для предотвращения одновременного вызова более одного AJAX.По сути, если ajaxCallInProgress имеет значение true, тогда он ждет, пока не будет установлено значение false при обратном вызове завершения где-либо, а затем сам устанавливает его в true, чтобы он мог сделать свой собственный вызов.Не идеальный подход, постановка очередей на вызовы имеет больше смысла, но это то, что он делает.

0 голосов
/ 11 февраля 2011

Если «ajaxCallInProgress» вначале имеет значение true и скрипт не выполняется асинхронно, это приведет к зависанию вашего браузера.

Если он работает асинхронно, он потребляет много ресурсов ЦП, но браузер не зависнет ... трудно что-то сказать из этого кода.

0 голосов
/ 11 февраля 2011

Этот код, похоже, ожидает ответа на вызов ajax. По сути, этот цикл ожидает, пока глобальная переменная ajaxCallInProgress не будет установлена ​​в false другой функцией JavaScript.

Поэтому, когда ответ получен, соответствующая функция JavaScript установит ajaxCallInProgress = false;, и ваш цикл остановится.

0 голосов
/ 11 февраля 2011

если ajaxCallInProgress имеет значение true, тогда он будет выполнять бесконечный цикл. Javascript является однопоточным, поэтому значение никогда не изменится внутри цикла. Вы хотите использовать функцию обратного вызова, чтобы знать, когда завершается вызов ajax.

То, что вы хотите, выглядит примерно так:

$. Get ('url', {params: true}, функция success (data) { / * это запустится, когда вызов ajax завершится * /});

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