2013-03-01 5 views
0
var desc; 
    $.ajax({ 
     url: "data/step2.xml", 
     dataType: "xml", 
     success: function(data){ 
      $(data).find('date').each(function(){ 
       var day = $(this).find('day').text(); 
       var date = $("#txtDate").datepicker("getDate"); 
       date = (date.getDate()+"-"+date.getMonth()+1+"-"+date.getFullYear()); 
       if (day==date){ 
        $(this).find('availability').each(function(){ 
         var prod = $(this).find('product').text(); 
         var time = $(this).find('starttime').text(); 
         if (prod==label){ 
          desc="!"; 
         } 
        }); 
       } 
      }); 
     } 
    }); 

У меня возникли некоторые проблемы с доступом к переменной desc ... Я хочу, чтобы манипулировать его значение, как вы можете видеть в desc="!", но она возвращает неопределенное значение. Разве нет способа сделать переменную глобальной или что-то еще? или какой-либо другой способ доступа к нему? ... О, и весь этот код находится внутри функции.Javascript «глобальная» переменная проблема

+1

$ .ajax по умолчанию асинхронный. Похоже, вы пытаетесь получить доступ к 'desc' до завершения вызова ajax. – techfoobar

+0

Сначала вы уверены, что ваш код запущен до 'desc ="! "'? – Ulflander

+0

Вы говорите «весь код внутри функции ...» *, которая * функция? Все ли внутри функции «успех»? –

ответ

2

В данном конкретном случае проблема не в определении области desc. Переменная desc, которую вы обрабатываете в обратном вызове success, является тем же самым, что и перед вызовом ajax.

Проблема здесь время. Метод success не выполняется одновременно с вызовом ajax. Он выполняется через некоторое время после завершения вызова ajax. Только в этом случае значение записывается в desc. Любой код, который обрабатывает значение desc должен быть вызван из точки, где значение desc устанавливается

if (prod == labe) { 
    desc = "!"; 
    onDescChanged(); 
} 
+0

О, получилось. Спасибо! Я попробую еще что-нибудь :) – zettca

0

Я предполагаю, что ваш код пытается что-то вроде:

function foo() { 
    var desc; 
    $.ajax({ 
     .... 
     success: function() { 
      ... 
      desc = "!"; 
     } 
    }); 
    return desc; // this will return undefined, as success() hasn't completed 
} 

Чтобы противостоять этому, используйте функцию обратного вызова как в ответе Джареда Пар.