Скажем, например, что у меня есть две функции со случайным кодом внутри, а также что на основе системы пользователя (медленная, средняя или быстрая) нет способа определить, сколько времени потребуется для выполнения двух функций, поэтомуиспользование setTimeout
нецелесообразно при попытке выстрелить function2
только после завершения function1
.
Как можно использовать jQuery.deferred
, чтобы сделать function2
огонь только после function1
независимо от того, каковы временные требования, и учитывая, что обе функции являются на 100% не-jQuery-функциями без кода jQuery внутри и, следовательно, совершенно не наблюдаемы jQuery?Самое большее, функции могут включать в себя методы jQuery, такие как .css()
, которые не имеют временной связи и могут работать медленнее на старых компьютерах.
Как убедиться, что function2
не выполняется одновременновремя как function1
, если я назову их так:
function1(); function2();
, используя $.deferred
?Любые другие ответы, кроме вопросов, касающихся $.deferred
, также приветствуются!
ДОБАВЛЕНО 20 марта: Что если function1 () является лямбда-функцией, где, в зависимости от пользовательского ввода, функция может или можетнет асинхронных вызовов, и невозможно определить, сколько операций будет выполнять функция?Это была бы функция, в которой у вас не было бы никакой подсказки о том, что произойдет дальше, но, несмотря ни на что, вы все равно хотели бы, чтобы функция function2 выполняла только после всего из функции lambda (function1)выполняется, независимо от того, сколько времени это займет, но до тех пор, пока асинхронные аспекты завершены.Как этого достичь?
ДОБАВЛЕНО 22 марта: Так что я думаю, что единственный способ сделать то, что я прошу, - передать анонимные функции в качестве обратных вызовов асинхронным функциям, которые выполняют обратные вызовы послеони сделаны, или для создания прослушивателей событий, которые будут выполнять то, что вы хотите, когда событие, наконец, сработает.
На самом деле нет никакого способа просто выполнить асинхронные вызовы на двух отдельных линиях и заставить их срабатывать по порядкубез ручного конструирования механизмов (обработчиков событий) внутри фрейма, содержащего упомянутые функции, для обработки фактического выполнения их действий.
Хорошим примером таких механизмов является метод .queue()
jQuery и объект $.Defferred
.
Ответы ниже, а также чтение API jQuery по .queue()
ing и использование $.Deferred
помогли прояснить это.
Tgr привел отличный пример ниже о том, как создавать собственные цепочки функцийиспользуя объект $.Deferred
в jQuery, а сами пользовательские функции не требуютсяобязательно должен быть какой-либо код jQuery внутри, именно это я и искал.