В моих плагинах jQuery я часто ожидаю, что некоторые обратные вызовы определяются пользователем, как в простом примере ниже
(function($) {
$.fn.myplugin = function(options) {
var s = $.extend({}, options),
$this = $(this);
if (typeof s['initCallback'] === 'function') {
s['initCallback']($this);
}
$this.animate({width: '+=300'}, 3000); /* animation in plugin */
}
})(jQuery);
Иногда определенный обратный вызов содержит такой синхронный код, и этот код работает как I 'ожидая
$('#mydiv').myplugin({
initCallback : function(mydiv) {
$('<div>This is synchronous, so it will entirely executed before animation</div>')
.insertBefore(mydiv);
}
});
, но в некоторых других случаях обратный вызов может определять асинхронную анимацию, подобную этой
$('#mydiv').myplugin({
initCallback : function(mydiv) {
$('<div>animations are not synchronous here</div>')
.insertBefore(mydiv)
.hide()
.fadeIn(4000); /* animation in callback */
}
});
, в этом последнем случае у нас есть две анимации, которые явно перекрываются, потому что после выполнениямой initCallback()
оставшийся код плагина не выполняется должным образом при fadeIn()
обратном вызове.
Итак, я спрашиваю: существует ли общий шаблон jQuery для работы с обоими типами кода (асинхронным / синхронным), чтобы быть уверенным, что initCallback()
когда-нибудь прервет выполнение, независимо от того, какой кодэто определяет?Или я должен кодировать оба случая двумя различными способами?
Код этого примера доступен на http://jsfiddle.net/fcalderan/LKttT/
Заранее спасибо.