jquery - дождаться завершения функции - PullRequest
1 голос
/ 17 апреля 2011

Если я правильно понимаю jquery и javqascript, это асинхронно.Чего я не понимаю, так это асинхронной только части ajax, загрузки и получения ... или всего в целом.

Например, если мне нужно добавить в список меню в форме и иметь:

$('#id').append("<option value='1'>1</option>") - etc., in this demo the <select id="category> is missing

теперь мне бы хотелось:

$('#category option[value="1"]').attr('selected', 'selected');

Конечно, я бы хотел, чтобы это выбрало значение 1 ПОСЛЕ того, как меню появляется, а не раньше, так как оно не существует.

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

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

Или только ajax вызывает асинхронность?Это что-то очевидное и для новичка, но я не могу найти хороших ключевых слов, чтобы точно определить эту основную вещь, поэтому я спрашиваю здесь.

Ответы [ 4 ]

5 голосов
/ 17 апреля 2011

Только AJAX, setTimeout, setInterval и обработчики событий являются асинхронными. Все остальное работает синхронно.

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

Хороший способ определить, выполняется ли кто-либо асинхронно, - проверить, передали ли вы функцию обратного вызова. Если вы сделаете это и , то это время, когда время выполнения зависит от внешних факторов (скорость сети) или что-то занимает некоторое время (например, исчезновение элемента), велика вероятность, что он выполняется асинхронно. Однако что-то вроде $.each работает синхронно, даже если оно работает с функцией обратного вызова. Но в этом случае нет ничего, когда выполнение искусственно замедляется или зависит от внешних факторов, поэтому нет никаких причин для его асинхронного выполнения.

2 голосов
/ 17 апреля 2011

Именно здесь появляются отложенные объекты и почему последний jQuery отлично подходит для их окончательного получения:

Например:

$.when(appendMenu()).then
(
function ()
    {
    $('#category option[value="1"]').attr('selected', 'selected');
    }
);

function appendMenu ()
{
var dfd = $.Deferred();
$('#id').append("<option value='1'>1</option>");
dfd.resolve();
return dfd.promise();
}

http://api.jquery.com/category/deferred-object/

Эта концепция в основном позволяет вам контролировать, когда код должен выполняться, основываясь на политике обещаний - пока отложенный объект не скажет, что это сделано, другой код не будет запущен.

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

0 голосов
/ 17 апреля 2011

В качестве альтернативы вы можете сделать это так:

$('#id').append("<option value='1' selected='selected'>1</option>")
0 голосов
/ 17 апреля 2011

Мне сказали, что большинство браузеров используют один поток для запуска javascript (если вы явно не включили многопоточный режим в Chrome)

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