Intereting Posts
Ссылки не работают при использовании css Важно ли использовать атрибуты img alt? Тег не отображается при создании с помощью php Запретить сброс входного значения при обновлении Не получать значения логина и пароля в div Карусель jQuery. Как показывать только следующий или предыдущий элемент Связывание элемента html с jQuery.click () с использованием атрибута “title” Выравнивание элементов бок о бок в HTML стилизация – удаление разрыва между North & Center (Primefaces) Раскраски ячеек Google Chart – диаграмма рассеяния Заполнение таблицы HTML на основе второго выбора Может ли CKEditor использоваться в приложении WinForms для (X) редактирования HTML? Приложения Google Chrome: как сделать прозрачный округленный фон, например, приложение Google для видеовстречи? как заменить одну часть URL-адреса, используя R Как сделать колоду карт Bootstrap 4 с карточками с фиксированной шириной?

Как вернуть значение функции после результата вызова ajax?

Пример:

function getfoo() { var foo = ""; $.get("foofile.html", function (data) { foo = data; }); return foo; } 

Но тогда, поскольку сценарий асинхронен, он вернет «”. Это явно не то, что я хочу.

Итак, я попробовал это:

 function getfoo() { var foo = ""; $.get("foofile.html", function (data) { foo = data; }); for (;;) { if (foo != "") { return foo; break; } } } 

И я ожидал, что это сработает, но этого не произошло. Почему нет? И может ли кто-нибудь предложить решение?

Вы должны использовать обратный вызов для функции и позволить ей обрабатывать ваши данные.

 function getfoo(callback) { var foo = ""; $.get("foofile.html", function (data) { callback(data); // do some other things // ... }); } getfoo(function(data) { console.log(data); }); 

При использовании ajax, вы должны написать свой код немного по-другому. Вы должны отделить свою логику вызывающего абонента и вызываемого абонента.

Предположим, что ваш существующий код

 function getfoo() { var foo = ""; $.get("foofile.html", function (data) { foo = data; }); return foo; } function usefoo(){ var data = getfoo(); // do something with data } 

Это действительно должно быть написано как

 function getfoo() { var foo = ""; $.get("foofile.html", function (data) { usefoo(data); }); } function usefoo(data){ // do something with data } 

Первый «а» ajax означает асинхронность, и поэтому то, что вы пытаетесь сделать, похоже на философию ajax. Однако можно использовать запрос блокировки, но это не поддерживается упрощенным интерфейсом .get и вы должны использовать функцию .ajax :

 var foo = "hmmm"; $.ajax("jquery.js", {async:false, success:function(x){foo=x}}); alert(foo); 

Основная модель исполнения javascript основана на событиях и однопоточной (есть веб-рабочие, которые обеспечивают multithreading, но каждый рабочий живет в своем собственном адресном пространстве и не может делиться какой-либо памятью с другими работниками или с основным streamом … так что в что они больше похожи на процессы, чем на streamи).

В Javascript вы не можете «ждать» в цикле для других событий, вы должны всегда быстро заканчивать работу, возможно, присоединяя обратные вызовы, которые будут вызваны снова, когда что-то произойдет. Если вы сделаете цикл, механизм javascript просто застрянет в этом цикле и не сможет выполнять другую обработку (если это видно из javascript). Например:

 // Warning: WRONG example... this won't work! var foo = 0; setTimeout(function(){foo = 1}, 100); // Set foo=1 after 100ms while (foo == 0) ; // Wait for that to happen alert(foo); 

НЕ будет работать, потому что движку браузера не разрешено выполнять другой код javascript (обратный вызов тайм-аута) до тех пор, пока основной путь кода не завершится.

Этот подход, основанный на событиях, упрощает программирование совсем немного (потому что нет необходимости в блокировке … всегда есть только один stream, управляющий состоянием), но заставляет использовать другой проект streamа для длительных операций.

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

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