В JQuery, можно ли вызвать обратный вызов или вызвать событие после призванию к .each()
(или любому другому типу итерационного обратного вызова) уже завершено .
Например, я хотел бы, чтобы это "исчезнуть и удалить", чтобы завершить
$(parentSelect).nextAll().fadeOut(200, function() {
$(this).remove();
});
перед выполнением некоторых вычислений и вставкой новых элементов после $(parentSelect)
. Мои расчеты неверны, если существующие элементы все еще видны jQuery, и спящий режим / задержка на произвольное количество времени (200 для каждого элемента) в лучшем случае кажется хрупким решением.
Я могу легко .bind()
необходимая логика обратного вызова события , но я не знаю , как чисто Чтобы запустить .trigger()
после выше итерации была завершена . Очевидно, я не могу вызвать триггер внутри итерации, поскольку он будет срабатывать несколько раз.
В случае $.each()
, я подумал добавить что-то в конец аргумента данных (что я бы вручную искал в теле итерации), но я бы не хотел, чтобы к этому принудили, поэтому я надеялся, что есть какой-то другой элегантный способ управления потоком относительно итеративных обратных вызовов.
Ответы:
Альтернатива ответу @ tv:
Обратите внимание, что
.each()
сам по себе является синхронным - оператор, следующий за вызовом,.each()
будет выполнен только после завершения.each()
вызова. Однако асинхронные операции, запущенные в.each()
итерации, будут, конечно, продолжаться по-своему. В этом-то и проблема: вызовы исчезновения элементов - это анимация, управляемая таймером, и они продолжаются в своем собственном темпе.Решение выше, следовательно, отслеживает, сколько элементов исчезло. Каждый вызов
.fadeOut()
получает обратный вызов завершения. Когда обратный вызов замечает, что он подсчитывается по всем задействованным исходным элементам, некоторые последующие действия могут быть предприняты с уверенностью, что все замирания завершены.Это четырехлетний ответ (на данный момент в 2014 году). Современный способ сделать это, вероятно, предполагает использование механизма отложенного / обещания, хотя вышеприведенное просто и должно работать нормально.
источник
Возможно, уже поздно, но я думаю, что этот код работает ...
источник
Хорошо, это может быть немного после того, как факт, но .promise () также должен достичь того, что вы ищете.
Обещающая документация
Пример из проекта, над которым я работаю:
:)
источник
JavaScript работает синхронно, поэтому все, что вы поместите после
each()
, не будет работать доeach()
будет завершено.Рассмотрим следующий тест:
Когда вызывается предупреждение, количество будет равно 1000000, потому что предупреждение не будет запущено, пока не
each()
будет сделано.источник
each
и планируете каждую анимацию отдельно, вам все равно придется запускать событие после анимации, а не каждую из них завершается.each()
проблема. Вот почему я бросил этот ответ в смесь.each
не будут вызываться раньшеalert
. Не могли бы вы объяснить или указать мне на чтение по этому вопросу?Я нашел много ответов, связанных с массивами, но не с объектом json. Мое решение состояло в том, чтобы просто выполнить итерацию по объекту один раз при увеличении счетчика, а затем при выполнении итерации по объекту для выполнения кода вы можете увеличить второй счетчик. Затем вы просто сравниваете два счетчика и получаете решение. Я знаю, что это немного неуклюже, но я не нашел более элегантного решения до сих пор. Это мой пример кода:
Как я уже сказал, он не самый элегантный, но он работает и работает хорошо, и я пока не нашел лучшего решения.
Ура, JP
источник
Если вы готовы сделать пару шагов, это может сработать. Это зависит от того, как анимации заканчиваются по порядку. Я не думаю, что это должно быть проблемой.
источник
что о
источник
Вы должны поставить в очередь остальную часть вашего запроса, чтобы он работал.
источник
Я столкнулся с той же проблемой, и я решил с помощью решения, как следующий код:
Решение решает следующую проблему: синхронизировать асинхронные операции, запущенные в итерации .each (), используя отложенный объект.
источник
Возможно поздний ответ, но есть пакет для обработки этого https://github.com/ACFBentveld/Await
источник
Я использую что-то вроде этого:
источник