Как установить и вернуть переменную внутри функции JavaScript? - PullRequest
0 голосов
/ 09 февраля 2012

сначала посмотрите пример, затем вы сможете понять мой вопрос.

var x;
function checkTime() {
    $.ajax({ 
        type: 'GET', 
        url: 'http://www.example.com/time.php', 
        data: test,
        dataType:'json',
        success: function (data) {
            if (data == 0){
                x = 'true';
            } else if (data == 1){
                x = 'false';
            }
        }
    });
}

checkTime();
alert (x);

предупреждение будет undefined

Мне нужно установить x внутри функций checkTime ивозьмите его за пределы функции

, даже если я сделаю:

var x = checkTime();
alert (x);

я все еще получу undefined

также мне нужно только проверить на истинность или ложь, может быть тамэто еще один способ сделать вещи.Я также попробовал:

...
if (data == 0){
    return true;
} else if (data == 1){
    return false;
}
...

но я не знаю, как это проверить.

в основном мне нужно что-то вроде:

if (x ==1) {// if (x == true) // сделать что-то}

есть идеи?

спасибо

Ответы [ 4 ]

4 голосов
/ 09 февраля 2012

Это происходит потому, что по умолчанию .ajax() является асинхронным .x не будет установлено к моменту срабатывания alert().Вам либо нужно установить .ajax() с помощью aync=false, либо передать функцию обратного вызова для вызова после завершения вашего Ajax-запроса, например,

function checkTime(callback) {
    $.ajax({ 
        type: 'GET', 
        url: 'http://www.example.com/time.php', 
        data: test,
        dataType:'json',
        success: function (data) {
            var x = '';
            if (data == 0){
                x = 'true';
            } else if (data == 1){
                x = 'false';
            }
            // Call the callback function with 'x'
            callback.call(null, x);
        }
    });
}

, а затем использовать его следующим образом:

checkTime(function (x) {
    alert(x);
});
2 голосов
/ 09 февраля 2012

Это происходит потому, что AJAX является асинхронным. Когда ваш код достигает оповещения, функция успеха AJAX-запроса еще не выполняется. Вы можете попытаться установить ajax-запрос в async: false или сделать предупреждение внутри функции успеха.

1 голос
/ 09 февраля 2012

Вы не можете напрямую получить доступ к возвращаемому значению функции, определенной для «success»;Во-первых, вы должны знать, что здесь задействованы две функции: checkTime и функция-обработчик безымянного события для события успеха вызова ajax.Вы хотите извлечь значение из этой безымянной функции-обработчика события;эта функция, однако, вызывается не напрямую из checkTime, а когда возвращается запрос AJAX (это программирование, управляемое событиями : function (data) {...} выполняется, когда событие вызов AJAX завершился ).

В вашем примере alert, который вы вызываете после выполнения checkTime, обычно вызывается до завершения запроса AJAX;это происходит потому, что запрос AJAX происходит асинхронно , и поэтому событие, когда вызов был успешным, еще не произошло.Если вы всегда хотите дождаться ответа на запрос, вы можете отключить асинхронность вызова AJAX (async: false);но, возможно, вы также можете сделать различие между тем, что вы хотите сделать непосредственно в обработчике событий, а не снаружи.Это был бы подход, если вы хотите следовать парадигме программирования, управляемой событиями.

Если вы хотите продолжать делать что-то еще во время выполнения запроса, ваши варианты также могут включать, например, использование некоторых других (например,global) переменная для «возвращаемого значения» вызова AJAX функции успеха (и, возможно, секунды для указания того, завершен ли вызов) и периодической проверки, если он уже установлен (но это не будет следовать парадигме программирования, управляемой событиями)и может считаться плохой практикой, так как необходим ненужный частый опрос переменной).

0 голосов
/ 09 февраля 2012

Это происходит потому, что checkTime() возвращается немедленно, прежде чем будет выполнена функция успеха. Функция успеха не выполняется до тех пор, пока не завершится вызов ajax, поэтому x еще не установлен, когда вы пытаетесь его использовать.

В зависимости от того, что вы пытаетесь выполнить, вы можете поместить предупреждение в обратный вызов успеха.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...