2013-05-16 6 views
2

Ниже приведен мой JavaScript. Как сделать переменную success глобальной, чтобы изменения, внесенные в успех ajax->, отражались за пределами?Доступ к глобальной переменной javascript

function foo() { 
    var success = false; 
    $.ajax({ 

     type: "POST", 
     url: "", 
     dataType: "xml", 
     success: function(xml) { 
      var code = parseInt($(xml).find("Response").attr("code"), 10); 
      switch (code) { 
       case 1: 
        success = false; 
        break; 
       case 0: 
        success = true; 
        break; 
      } 
     } 
    }); 
    return success; 
} 
+1

Я считаю, что если вы объявляете его вне любой функции, это глобальная переменная. Это будет что-то вроде 'window.success' !!! – NINCOMPOOP

+0

Не знаете, что именно вы пытаетесь достичь, но переменная «успех» установлена ​​правильно и должна работать. Кроме того, если вы возвращаете «успех», это означает, что вы используете его в функции, создавая закрытую переменную для этой конкретной функции. Если вы хотите сделать глобальную переменную, просто поставьте ее в начале сценария или просто вне этой функции. –

+1

Это буквально самый заданный вопрос в JavaScript SO. Это все в названии: AJAX или ** Асинхронный ** JavaScript и XML. – elclanrs

ответ

4

Передайте функцию обратного вызова, которая вызывается в success:

function makeCall(callback) { 
    $.ajax({ 
     type: "POST", 
     url: "", 
     dataType: "xml", 
     success: function(xml) { 
      var code = parseInt($(xml).find("Response").attr("code"), 10); 
      callback(!code); 
     } 
    }); 
} 

makeCall(function (success) { 
    alert(success); 
}); 

Это как асинхронное программирование/запросы работы. Конечно, альтернатива заключается в том, чтобы сделать его синхронным запросом, но это как бы поражает цель.

Я сконденсировал материал switch, потому что вам, казалось, нужны противоположные логические значения 0 и 1.

0

Подход, который вы используете, не будет работать. Ajax-вызов является асинхронным. Это означает, что он вернется сразу же до того, как будет запущен фактический GET. Таким образом, внешний var (доступный изнутри обратного вызова успеха, благодаря закрытию) не будет иметь никакого значения, кроме того, которое было установлено до вызова Ajax к моменту его возврата. Вместо этого вы можете указать, что вызов Ajax запускается синхронно, установив async: false вместе с другими значениями в $ .ajax или вы можете реструктурировать код, чтобы делать то, что вы хотели сделать, если функция вернула true, поместив ее внутри успешный обратный вызов.

+0

Я думал о том, чтобы вы продвигать вас, пока я не увидел, что вы рекомендуете «async: false» –

+0

'async: false' является' ajax', поскольку 'eval' соответствует' string'? – elclanrs

+0

@elclanrs no. 'eval' просто приглашает инъекции и медленно, как ад. 'async: false' - чистое зло ;-) –

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