Как определить, завершена ли асинхронная функция перед выполнением другой в jQuery (на очень медленных компьютерах)? - PullRequest
2 голосов
/ 16 мая 2011

Например, допустим, я использую метод .addClass ().Вы не можете добавить к нему обратный вызов (например, вы не можете сделать $ ('...'). AddClass ('...'). Load ('...')).

В большинстве случаев вы можете просто вызывать свои функции вплотную перед использованием .load (), и все в порядке.

Но что, если у меня супер медленный компьютер, где использование .addClass () занимает 5 секунд?Как выполнить другую асинхронную функцию только после завершения .addClass () или, если на то пошло, после завершения любой асинхронной функции JavaScript?

РЕДАКТИРОВАТЬ: Iбыло неправильно, .addClass не асинхронный.

Итак, просто чтобы быть уверенным:

$('foo').addClass('');
/*this code here will not execute UNLESS the previous line is absolutely finished?*/

Ответы [ 3 ]

8 голосов
/ 16 мая 2011

addClass не является асинхронным, и нет среды, в которой для выполнения его работы потребуется значительное время.Различные операции jQuery, которые являются асинхронными (ajax, эффекты и тому подобное), принимают обратные вызовы как часть своего API.

I думать (не возвращаясь и не возвращаясь-читание API), что если функция API не имеет обратного вызова, вы можете предположить, что операция является синхронной.

Обратное неверно;В jQuery есть несколько функций API (например, each), которые принимают обратные вызовы, которые не являются асинхронными, просто обратный вызов удобен по другим причинам.

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

Обновление : решение обновленного вопроса: правильно, код после addClass не будет выполняться до тех пор, пока addClass не будет завершен.Даже если это заняло секунду или две (что, конечно, не так, но давайте представим), addClass выполнит свою работу и вернется к вашему коду.Последующий код не будет работать до тех пор, пока он не будет запущен, и никакой другой код не может быть запущен, пока это происходит (поскольку JavaScript в веб-браузерах является однопоточным, если вы не используете веб-работников , и даже тогда координация между потоками является явной).

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

doSomethingTheBrowserHasToThinkAbout();
setTimeout(function() {
    // Now you know the browser's had time to think about it
    doSomethingElse();
}, 0); // <== Won't really be 0, most browsers clamp this to 5-10ms minimum

Но вы нене нужно делать это (и не хочу этого делать) за исключением определенных конкретных операций.Извините, я не сразу вспоминаю пример, но мы говорим о крайних случаях здесь.

3 голосов
/ 19 декабря 2014

addClass не завершается для меня, пока я не добавлю последующий ajax / рендеринг в setTimeout. Это должно быть асинхронным до некоторой степени. Я пытаюсь добавить класс к телу (для загрузки GIF), и он просто добавляет атрибут «класс» без значения. Когда код после помещается в setTimeout, он завершается. Это в Chrome и почти 4 года спустя ...

2 голосов
/ 16 мая 2011

addClass не является асинхронным. В jQuery асинхронные методы позволяют вам указать функцию обратного вызова, которая будет вызываться после завершения метода. Если нет сигнатуры метода, которая принимает обратный вызов, скорее всего, метод является синхронным.

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