У меня есть следующий код JavaScript:
$('a.button').click(function(){
if (condition == 'true'){
function1(someVariable);
function2(someOtherVariable);
}
else {
doThis(someVariable);
}
});
Как я могу убедиться, что function2
вызов вызывается только после function1
завершения?
javascript
jquery
Rrryyyaaannn
источник
источник
function1
выполнение операции асинхронной?Ответы:
Укажите анонимный обратный вызов и заставьте function1 принять его:
источник
...do stuff
ней есть асинхронные объекты? Функция 2 по-прежнему не сработает, как ожидается. Пример в моем комментарии выше показывает, что, посколькуfoo()
функция содержит асинхронный код,bar()
она не запускает свое содержимое после выполненияfoo()
содержимого, даже используя$.when().then()
для вызова их один за другим. Этот ответ действителен только в том случае, если (и только если) все содержимое...do stuff
вашего кода строго синхронно.callBack()
после выполнения всех n асинхронных вызовов. Поскольку OP не упомянул, что он делает в функции, он принял это как одноуровневый асинхронный вызов.Если вы используете jQuery 1.5, вы можете использовать новый шаблон Deferreds:
Изменить: Обновленная ссылка на блог:
Ребекка Мерфи написала отличную статью об этом здесь: http://rmurphey.com/blog/2010/12/25/deferreds-coming-to-jquery/
источник
$.when(function1).then(function2);
(без скобок, вызывающих функцию)?function1
должен вернуть обещание. В этом случае это должна быть фактическая выполняемая функция, а не ссылка. Когдаresolve
вызывается то обещание, тоfunction2
выполняется. Это легко объяснить, если предположить, чтоfunction1
есть вызов ajax.done
Обратный вызов будет затем решить обещание. Надеюсь, это понятно.Попробуй это :
источник
Этот ответ использует
promises
функциюECMAScript 6
стандарта JavaScript . Если ваша целевая платформа не поддерживаетpromises
, заполните ее с помощью PromiseJs .Обещания - это новый (и намного лучший) способ обработки асинхронных операций в JavaScript:
В этом простом примере это может показаться значительным перерасходом, но для более сложного кода это гораздо лучше, чем использование обратных вызовов. Вы можете легко объединить несколько асинхронных вызовов, используя несколько
then
операторов:Вы также можете легко обернуть jQuery deferrds (которые возвращаются из
$.ajax
вызовов):Как отметил @charlietfl,
jqXHR
возвращаемый объект$.ajax()
реализуетPromise
интерфейс. Так что на самом деле не нужно оборачивать его вPromise
, его можно использовать напрямую:источник
Promise.resolve
обертывание$.ajax
- это анти-паттерн, так как$.ajax
возвращает обещанное обещаниеPromise
, он просто реализует интерфейс. Я не уверен, как он себя ведет, передавая вещественноеPromise
значение егоthen
методу, или чтоPromise.all
будет делать, еслиjqXHR
емуPromise
передаются a и a . Для этого мне нужно сделать дальнейшее тестирование. Но спасибо за подсказку, я добавлю это в ответ!$.ajax.then
не новаИли вы можете вызвать пользовательское событие после завершения одной функции, а затем привязать его к документу:
Используя этот метод, функция 'b' может выполнять только ПОСЛЕ функции 'a', поскольку триггер существует только после завершения функции a.
источник
Вы можете сделать это так
источник
Это зависит от того, что делает function1.
Если function1 выполняет какой-то простой синхронный javascript, такой как обновление значения div или чего-то еще, то function2 сработает после завершения function1.
Если function1 выполняет асинхронный вызов, такой как вызов AJAX, вам необходимо создать метод «обратного вызова» (большинство API-интерфейсов ajax имеют параметр функции обратного вызова). Затем вызовите function2 в обратном вызове. например:
источник
Если метод 1 должен быть выполнен после метода 2, 3, 4. Следующий фрагмент кода может быть решением для этого с использованием отложенного объекта в JavaScript.
источник
Если function1 - это какая-то функция синхронизации, которую вы хотите превратить в асинхронную, потому что для ее завершения требуется некоторое время, и вы не можете контролировать ее, чтобы добавить обратный вызов:
Выход будет:
... и через 2 секунды:
Это работает, потому что вызов window.setTimeout () добавит задачу к циклу рутинной задачи JS, что и делает асинхронный вызов, и потому что основной принцип «от завершения к завершению» среды выполнения JS гарантирует, что onClick () никогда не прерывается до его окончания.
Обратите внимание, что это так смешно, как может быть, код трудно понять ...
источник