Mic*_*sis 2 javascript callback
我有一个包含回调的函数,当完成时,我想有选择地将其中继回原始函数调用。
例如:
const UI = {
update : function(var1) {
$(var1).animate({ opacity: 0 }, 100, "linear", function() {
// Callback 1: Do stuff
});
}
}
Run Code Online (Sandbox Code Playgroud)
我想要的是以下内容:
UI.update("whatever", function() {
// Callback 2: Do more stuff after Callback 1 is complete
});
Run Code Online (Sandbox Code Playgroud)
是否可以像这样内联?
是的,当然可以-只需为回调声明一个参数,然后update在动画结束时不需要执行任何操作,只需将回调animate直接传递给:
const UI = {
update : function(var1, callback) {
// -------------------------^
$(var1).animate({ opacity: 0 }, 100, "linear", callback); // ***
}
};
Run Code Online (Sandbox Code Playgroud)
如果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...*/); // ***
} // ***
});
}
}
Run Code Online (Sandbox Code Playgroud)
callback直到update返回后才可以调用。该animate回调是一个封闭 ¹ , ²在var1和callback (更准确地说,在词法环境中,他们中存在),所以他们会保持访问后update返回。
您可能只对上面显示的“真实”检查感到满意。其他时候,人们会更加严格,例如:
if (typeof callback === "function") {
Run Code Online (Sandbox Code Playgroud)
(很多年前,在Web浏览器中,某些主机提供的功能"object"而不是"function"它们提供的功能typeof,但是所有模糊的现代浏览器都确保了"function"现在的功能。)
有关闭包的更多信息:
¹ 在我贫乏的小博客中,关闭并不复杂(一些过时的术语,但是...)