2016-06-15 6 views
0

Моя функция OAuth.getSessionInfo возвращает ответ по-прежнему, почему цикл бесконечен?Значение глобальной переменной, не отражающееся в цикле

var resp = false; 
OAuth.getSessionInfo(function(data) { 
    resp = true; 
}) 
do { 
    console.log("waiting............") 
} while (!resp); 

PS: Просьба предложить хорошее название для вопроса .. Я смущен от того, что должно быть название для вопроса

+1

Что вы получите, если вы запустите этот 'console.log (data.sessionActive);' ?? –

+0

Я предлагаю добавить пару 'console.log' в ветвях if и распечатать значение resp также в цикле do-while, просто чтобы выяснить, что происходит. – lud1977

+0

@MohitBhardwaj Я правильно понял, когда попытался console.log (data.sessionActive); – mahaDev

ответ

1

Позволяет напомнить, что многопоточность и параллелизм означает:

  • Многопоточность - делать несколько вещей одновременно.
  • Параллельность - быстрое переключение между несколькими вещами, тем самым имитируя их одновременно.

Javascript не поддерживает ни первую технику, ни вторую. Вместо этого он выполняет блок кода до конца и затем выполняет следующий блок, который был запланирован с setTimeout или setInterval, или тот, который пришел из обработчика события (например, onclick, onload).

Теперь, если вы посмотрите на свой код, вы можете увидеть, что он не может быть выполнен без завершения внутренней функции, но эта внутренняя функция не будет выполнена до тех пор, пока внешний не завершится. Вот почему ваше приложение зависает. Вы также можете попробовать следующий код, который демонстрирует вашу проблему:

setTimeout(function() { 
    x = false; 
    console.log("won't be invoked"); 
}, 0);   
var x = true; 
while(x) {   
    console.log('looping'); 
} 

P.S. Эта специфика javascript также является причиной отсутствия функции sleep - просто не имеет смысла останавливать единственного исполнятеля кода, который у вас есть.

0

Вы получаете бесконечный цикл, потому что ваш цикл в то время продолжает работать, потому что это не есть точка для остановки. То, как вы это делаете, теперь говорит, что это правда. Так что он продолжает работать.

+0

"* он говорит, что это правда, правда". Вы имеете в виду: делайте это while (resp ===) * false *? – Marcus

+0

@Marcus Нет, это говорит об этом, пока (правда) я, вероятно, должен был быть яснее. Поскольку sessionInfo ожидает ответа на возврат, цикл while не знает, что нового значения 'resp', когда оно попадает в цикл while, так что прямо сейчас, когда он начинает запускать цикл it'! Resp', который был установлен на false, поэтому он делает противоположное while (true) – Enjayy

+0

Ugh. Ты прав. Забыл, что 'resp = false', чтобы начать с чего отрицает'! 'И читает' while (true) '. Виноват. – Marcus

0

Как только цикл запущен, вы не обновили значение resp. Попробуйте следующее:

var resp = false; 

do { 
    OAuth.getSessionInfo(function(data) { 
     if (data.sessionActive == true) { 
      resp = true; 
     } else { 
      resp = false; 
     } 
    }); 
    console.log("waiting............") 
} while (!resp); 
+0

это вызовет слишком много вызовов api через OAuth.getSessionInfo() .. Я хочу, чтобы этот api запускался только один раз – mahaDev

+0

И как следует обновлять 'resp'? По фрагменту, который вы разделили, он вызывает бесконечный цикл, если значение false. Отредактированный фрагмент вызовет API до тех пор, пока вы не получите значение data.sessionActive. Я не знаю наверняка, если это желаемый результат. –