2010-07-01 2 views
2

небольшое недоразумение с переменными JQuery и JS. Простой пример:JQuery и JS переменные

function someFunc(){ 

    var flag = true; 

    $(function(){ 
     $.post("/some/address/", {} ,function(data){ 
      if(data == false){    
       flag = false; 
      } 
     }); 
    }); 
    if(flag == false){ 
     return false; 
    }  
} 

Основная проблема - доступность флага переменной в функциях JQuery. Я всегда получаю одинаковое значение флага, равное true. Как это сделать? Как сделать глобальную переменную видимой для JS и JQuery?

+0

8 ответов через 6 минут ... wow – jantimon

ответ

7

Я не думаю, что ваша проблема здесь одна из сферы, на самом деле; Я думаю, ваша проблема в том, что функция post является асинхронной. То есть, он отправляется на сервер для получения данных и запускает функцию обратного вызова (которая обновляет ваш флаг), когда данные возвращаются (что может занять некоторое время). Но тем временем окружающая функция продолжает двигаться; он не ждет возвращения post. Таким образом, обновление флага происходит после возврата внешней функции.

+0

+1 вы били @ Darin Dimitrov на 1 секунду;) – gnarf

+1

Как это исправить: используйте ajax-опцию jQuery 'async: false' http://api.jquery.com/jQuery .ajax/дождаться запроса AJAX. Также избавитесь от привязки '$ (function() {})' document-ready. –

+2

@Marcel - я бы не рекомендовал «async: false», не заметив, что он заблокирует браузер до получения ответа, что может быть проблемой. Существуют и другие средства правовой защиты, которые не являются потенциально разрушительными. Если наличие блокировки браузера является приемлемым, то «async: false» является хорошим решением. : o) – user113716

0

На первый взгляд кажется, что, установив flag = 'false' (с «ложью», являющейся строкой) вместо flag = false как bool, тестирование на flag == false никогда не будет истинным.

UPDATE

Кроме того, ваш код JQuery делает запись, которая будет возвращать гораздо позже, чем чек на flag == false. Кажется, вы считаете, что код работает полностью линейно, но метод обратного вызова, который вы устанавливаете flag == false, будет вызываться в гораздо более позднее время.

+0

Да, это была моя маленькая ошибка. Я починил это. Но все это остается тем же ... – Bounce

0

Проблема заключается в том, что функция обратного вызова называется намного позже, поскольку AJAX является асинхронным. $.post немедленно возвращается, а следующая строка выполняется, когда флаг по-прежнему является ложным.

4

Вы делаете два асинхронных операций:

  • $(function(){}) - пожары функции, когда документ "готов"
  • $.post - пожары запрос XHR

Ни один из них будет немедленно вернуться , - например запрос XHR принимает время для завершения - вот почему вы передаете функцию обратного вызова (чтобы вы могли делать вещи после завершения).

Хотя эти операции происходят ваш JS будет продолжать выполнение, что означает, что это:

if(flag == false){ 
    return false; 
} 

... выполняется перед каждой операцией (в лучшем случае, только $.post операции) завершается.

+0

Ни один из них не будет * выполнять * немедленно - за исключением того, что документ уже готов, '$ (function() {...})' будет немедленно вызван. – gnarf

1

Обратный вызов AJAX выполняется только после того, как вы вернетесь.

Поэтому, когда вы пишете if(flag == false), то post обратного вызова не выполняется, так flag еще true.

0

$(function(){ ... }) и $.post("address", function() { ... }) не блокировать. Таким образом, ваш код обратного вызова в ... не будет выполнен до того, как js-интерпретатор будет удален if(flag == false).Это эквивалентно:

var flag = true; 
doSomethingLater(); 
if(flag == false) 
    ... 

flag всегда будет true.

Удалить $(function(){ ... }) и использовать async: falseoption для запросов ajax.

Смежные вопросы