2016-10-25 3 views
-3

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

Что я делаю, это создание объектов с использованием UID. Все, что построил объект, требует этого UID, и оно требует, чтобы оно было проверено как уникальное, прежде чем с ним можно было бы сделать что-либо.

Я произвольно генерирую UID в javascript, и я проверяю его на все остальные записи в базе данных SQL. Я отправляю в базу данных с помощью PHP и Ajax.

Основная проблема, с которой я сталкиваюсь, заключается в том, что Javascript не ждет ответа Ajax и вместо этого просто продолжает катиться. Ajax должен использовать обработчик успеха. Это невозможно для меня, потому что я не может ничего не делать, пока не буду уверен, что UID проверен.

Есть ли меток или решение этой проблемы? Обещания не будут работать, потому что, как я уже говорил, UID является неотъемлемой частью построения объекта сам по себе, поэтому использование заполнителей не будет работать.

Заранее благодарен!

+0

Если вы используете jQuery, посмотрите параметр 'async' $ .ajax (установите его на' false') - см. Также http://api.jquery.com/jQuery.ajax/ – Andreas

+1

, поэтому .. .. почему вы не можете подождать с созданием объекта, пока ваш первый вызов ajax не вернется с успехом? Вы можете использовать метод создания объекта из этого обратного вызова, верно? –

+0

Похоже, вы генерируете UID на стороне клиента, а затем проверяете с сервера/db. Не можете ли вы создать проверенный UID на сервере и перейти на страницу при первой загрузке? –

ответ

1

Вы можете просто отправить синхронный запрос Ajax, так:

var response = $.ajax({ url : "http://api.jquery.com/jquery.ajax/", async : false }); 

(хотя это не очень хорошая практика)

+0

Вот что я был пытаясь избежать, использовал 'async: false'. Я также знаю, что, по-видимому, async устарел во многих браузерах, что является еще одной серьезной проблемой. Выполняет ли async предотвращение запуска JavaScript _all_ Javascript или предотвращает ли этот конкретный стек отказ? – Kats

+0

Да, но это так, как при загрузке страницы в первый раз, и поэтому все придется ждать, пока не будет возвращен успех! – Dennisrec

+0

он блокирует браузер, в основном. поэтому звонки с синхронизацией очень сильно устарели –

0

Ok. Одно из возможных решений, если ваш UID генерируется на сервере случайным образом, вы можете предоставить его прямо в свой index.html с помощью тега script.

<head> 
<script src="path_to_url_that_provides_generated_script"></script> 
<script .... other scripts></script> 
</head> 

И этот сгенерированный скрипт будет что-то вроде:

var UID = "xxxx-xxxx-xxxx-xxxx"; 

Таким образом, вы даже не нужно делать Ajax запрос, так как ваш UID будет известно до любой другой скрипт обрабатывается.

0

Лучший метод, я обнаружил, заключался в том, чтобы переписать мой код, чтобы не начинать создание объекта, пока у меня не было UID. Хотя для этого требуется значительное количество времени, и чтобы не было никаких громоздких ошибок, нет другого реального решения, которое будет простым и эффективным.

Как выясняется, предвидение - это то, что, как всегда, помогает хорошим программистам писать и переписывать свою работу снова.

Особая благодарность @Vladimir M за решение.

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