Почему эта функция jQuery не будет работать правильно? - PullRequest
1 голос
/ 30 мая 2009

Я абсолютный нуб, когда дело доходит до jQuery, но я пытаюсь учиться. Что в замешательстве я делаю здесь неправильно?

function MakeCall(url) { 
var result;
$.ajax({
    url: url,
    dataType: "text",
    success: function(txt) {
        result = txt;
        return;
    }
});
alert(result);
return result;
}

EDIT:

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

Большое спасибо ...

Ответы [ 8 ]

13 голосов
/ 30 мая 2009
    result == txt;

Должно быть

    result = txt;

Ваша вторая проблема - асинхронные вызовы ajax. то есть оператор alert (result), вероятно, будет выполнен перед функцией обратного вызова success.

Вы спрашиваете, как это предотвратить. Ты не можешь Это не ошибка. Это то, что означает AJAX. Если вы хотите, чтобы что-то было выполнено после вызова ajax, добавьте это в функцию обратного вызова success.

Редактировать

Если вам действительно нужно обработать результат в какой-либо другой функции, вы можете сделать это:

$.ajax({
    url: url,
    dataType: "text",
    success: function(result) {
        someOtherFunction(result)
        return;
    }
});
3 голосов
/ 30 мая 2009

Извинения - я перекладываю ответ на вопрос, только видел другой вопрос, который этот парень отправил первоначально.

Ajax-функции Jquery являются асинхронными - поэтому функция успеха будет вызываться после , когда будет запущено второе предупреждение. Затем он вернется из функции до завершения метода ajax.

Если вы действительно хотите создать приложение таким образом, вы можете добавить к вызову опцию async , установив для нее значение false. (http://docs.jquery.com/Ajax/jQuery.ajax#options, см. Первую запись.) Это приведет к тому, что функция успеха будет вызвана до того, как метод $ .ajax вернется.

Однако блокировать вызовы ajax не рекомендуется, так как это приведет к зависанию скрипта и браузера.

Поэтому я советую вам реструктурировать приложение следующим образом:

function MakeCall(url, callback) { 

$.ajax({
    url: url,
    dataType: "text",
    success: callback
});

}

MakeCall('http://theurl.com', function(txt) {
        result = txt;
        alert(result);
        return;
});
3 голосов
/ 30 мая 2009

Я думаю, что это связано с асинхронной природой вызовов сервера javascript: javascript не ожидает ответа, прежде чем перейти к вызову alert ()

2 голосов
/ 30 мая 2009

Возможно, вызов ajax еще не вернулся, когда вы сделаете предупреждение?

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

2 голосов
/ 30 мая 2009

Это происходит потому, что оповещение происходит сразу после отправки AJAX. AJAX является асинхронным, поэтому простой отправки запроса недостаточно для заполнения результата.

Поместите окно сообщения в функцию успеха или вызовите функцию из функции успеха.

2 голосов
/ 30 мая 2009

Секунда возвращает неопределенное значение, потому что ничему не присваивается результат . Как говорят другие,

изменить на

 result= txt;

результат == txt - это способ сравнения, а не назначения

Edit-

Вторая проблема заключается в том, что javascript не будет ждать окончания работы ajax, прежде чем он выдаст свое предупреждение. A в ajax означает Asynchronous , что означает, что другие вещи будут выполняться, не дожидаясь завершения функции ajax

2 голосов
/ 30 мая 2009

Оператор присваивания в javascript: =

result = txt;
1 голос
/ 30 мая 2009

Функция $ .ajax () по умолчанию асинхронна (это A в AJAX), поэтому предупреждение происходит до завершения функции обратного вызова AJAX. Если вам нужна функция для возврата значения, используйте параметр async.

$.ajax({
    async: false, // disable asynchronous ajax
    url: url,
    dataType: "text",
    success: function(txt) {
        result = txt;
        return;
    }
});

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

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