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

(Не хотел создавать новый вопрос, но изменил старый настолько, что ответы не имеют смысла, и теперь появилась новая проблема)

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

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

Моя проблема в том, что первое оповещение возвращает правильное значение, но второе оповещение возвращает «неопределенное», и оно всплывает ДО первого оповещения, даже если результат устанавливается в функции успеха ... вздох. .. Что я делаю неправильно? (

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

Ответы [ 3 ]

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;
});
2 голосов
/ 30 мая 2009

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

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

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

function MakeCall(url, functionToRunWhenDataArrives) { 
  $.ajax({
    url: url,
    dataType: "text",
    success: functionToRunWhenDataArrives
  });
}

MakeCall('myurl.com', function(txt){
   // do stuff with txt here!
});

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

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

Ajax является асинхронным и не блокирует поток. Так это работает так:

  • Вы звоните $ .ajax, запрос отправлен на сервер
  • Код переходит к предупреждению после вызова $ .ajax, и, поскольку он еще не завершил запрос, переменная результата по-прежнему не определена
  • Через некоторое время запрос завершен, и в функции успеха вызывается предупреждение с результатом

jQuery имеет флаг, который вы можете использовать, чтобы сделать запрос синхронным, но это обычно считается плохой практикой.

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