Да, конечно & mdash; просто объявите параметр для обратного вызова, а затем, если update
ничего не нужно делать после завершения анимации, просто передайте обратный вызов animate
напрямую:
const UI = {
update : function(var1, callback) {
// -------------------------^
$(var1).animate({ opacity: 0 }, 100, "linear", callback); // ***
}
};
Если update
необходимо выполнить дополнительную работу перед обратным вызовом, просто вызовите обратный вызов из animate
обратного вызова:
const UI = {
update : function(var1, callback) {
// ---------------------^
$(var1).animate({ opacity: 0 }, 100, "linear", function() {
// ...work `update` does here...
// Call the callback:
if (callback) { // ***
callback(/*...perhaps some arguments here...*/); // ***
} // ***
});
}
}
Это не проблема, что вызов callback
не будет до тех пор, пока не вернется update
. Обратный вызов animate
представляет собой замыкание ¹ , ² сверх var1
и callback
(точнее, по лексической среде, в которой они существуют) , поэтому они останутся доступными после возврата update
.
Вы можете быть счастливы только с помощью "правдивой" проверки, показанной выше. В других случаях люди более строгие, например ::1010 *
if (typeof callback === "function") {
(Много лет назад в веб-браузерах некоторые функции, предоставляемые хостом, имели "object"
вместо "function"
для их typeof
, но все смутно современные браузеры гарантируют, что сейчас "function"
.)
Подробнее о замыканиях:
¹ Закрытия не сложны в моем маленьком анемичном блоге (некоторая устаревшая терминология, но ...)
² Вопрос переполнения канонического стека о замыканиях