2012-05-02 10 views
2

У меня есть ситуации, когда мне нужно инициализировать/назначить переменные из результатов вызова JQuery AJAX, а затем использовать эти переменные далее вниз по сценарию:Как использовать и повторно использовать переменные JS через функцию

var shouldRedirect = ??? 

$.ajax({ 
    url: 'http://example.com', 
    type: 'GET', 
    data: 'blah', 
    asynch: false, 
    timeout: 1800, 
    success: function(data) { 
     shouldRedirect = data.rows[0].redirectFlag 
    } 
}); 

if(shouldRedirect) 
    window.location = "..."; 

два вопроса у меня:

  • Предполагая, что результирующий JSON будет содержать redirectFlag логическое значение, это data.rows[0].redirectFlag правильный способ получения значения для моей переменной ?; и
  • Что мне инициализировать shouldRedirect до того, как AJAX стартует (как я могу сказать, «создайте переменную, но не придайте ей значения!»)?

Заранее благодарен!

+2

Ваш 'asynch' свойство не так, он должен быть' async'. Это никогда не будет работать, если запрос является асинхронным, поэтому вам нужно будет его изменить. –

+0

@JamesAllardice: Я бы сказал, что это хорошо. запросы синхронизации в любом случае плохи :) – ThiefMaster

+0

@ThiefMaster - Согласен, они плохие, но в этом случае это единственный способ сделать то, что пытается сделать OP (используйте значение, возвращаемое запросом AJAX за пределами события 'success' обработчик). –

ответ

1

Вы можете объявить неинициализированные переменные, просто выполнив следующие действия:

var shouldRedirect; 

Если ваша логика требует вы, конечно, можете инициализировать его ложь:

var shouldRedirect = false; 

Это не может быть то, что вы хотите хоть. Вы можете проверить, если переменная была инициализирована строго сравнивая его с undefined:

if (shouldRedirect === undefined) // do something 

Примечание хотя, что вы должны использовать тройной оператор, равный (он же строгое равенство) или ваши результаты не будут, как и ожидалось. С другой стороны, неопределенная переменная даст результат ложной. Это означает, что при проверке переменной с простым if (shouldRedirect) и переменная не определена, тогда она будет давать false, как если бы она была установлена ​​в значение false. Это справедливо и для нескольких других значений в JavaScript, например пустая строка "" или значение null. Вы можете увидеть полный список значений ложности here. Если вы хотите явно проверить истину или ложь и хотите опустить другие значения ложности или правды, тогда вы должны проверить с тройным равенством, например if (shouldRedirect === true).

Кроме того, если data.rows[0].redirectFlag является правильным способом доступа к значению, это в значительной степени зависит от того, как выглядит структура данных, получаемая вами от вашего вызова AJAX. Если это что-то вроде следующего было бы правильно:

{ rows: [ {redirectFlag: true}, {redirectFlag: false} ] } 

Если JSON выглядит следующим образом, хотя

{ redirectFlag: false } 

, то вы должны получить доступ к redirectFlag просто с data.redirectFlag.

0
  • Что я инициализировать shouldRedirect, чтобы до того, как AJAX будет стартовало (как я говорю «создать переменную, но не дают ему значение еще!»)?

    Вы можете просто сделать: var shouldRedirect;

Однако, я хотел бы сделать var shouldRedirect = false; обеспечить shouldRedirect не неопределенное

  • Является data.rows [0] .redirectFlag правильного пути получения значение для моей переменной?

Зависит от того, что вы отправляете по запросу AJAX. Обычно ответы в формате JSON, так что если вы отправляете объект JSON обратно со значением истинной, то вы можете сделать:

shouldRedirect = data.redirectFlag; 
0

Для части № 1, чтобы объявить переменную с ней, имеющей значение использования: вар shouldRedirect. Таким образом, вы можете просто сделать if (! ShouldRedirect) {}.

Для части №2. Как получить значение из redirectFlag основано на формировании данных, возвращаемых из вызова ajax. data ... будет отправной точкой для получения значения.

0

Как уже упоминалось в разделе комментариев, настройка shouldRedirect флаг не собирается, чтобы помочь как if инструкции, следующей за $.ajax запрос будет оцениваться до того, как результат извлекается из сервера - это общая проблема, стоящая перед в асинхронной выполнение кода. Хотя теоретически вы можете заставить jQuery.ajax в синхронный режим через параметр sync, я бы не рекомендовал этого, так как он заблокирует пользовательский интерфейс браузера во время запроса.

Вам нужно переместить код перенаправления в функцию $.ajaxsuccess так:

$.ajax({ 
    url: 'http://example.com', 
    // ... other options omitted for brevity 

    success: function(data) { 
     // This code block gets executed when the operation completes. 
     var shouldRedirect = data.rows[0].redirectFlag 
     if (shouldRedirect) { 
      // Your redirection code goes here. 
      window.location = "..."; 
     } 
    } 
}); 

Если использование JQuery 1.7 или выше, вы можете использовать их Promises/A реализацию через defered object. Отложенный объект позволяет выполнять одну или несколько функций при завершении операции и упрощает чтение асинхронного кода.

$.ajax({ url: 'http://example.com' }) 
    .done(function(data) { 
     // This code block gets executed when the operation completes. 
    }); 

Вместо передачи замыкание функции в done, вы также можете передать ссылку на функцию члена, например:

$.ajax({ url: url }).done(onDataLoaded); 

function onDataLoaded(data) { 
    // This function gets called when the ajax operation completes. 
} 
Смежные вопросы