gpt4 book ai didi

javascript - 向以下模块添加回调的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-02 14:33:45 25 4
gpt4 key购买 nike

我有以下模块

var m=(function() {
// setup variables

return {
center: function() {
// do stuff
},

open: function(settings) {

// do open stuff
// setups the handler for the close...

$close.on("click",function(e) {
e.preventDefault();
m.close();
});
},

close: function() {
// do close stuff
// ** need to add code here
//to perform a callback function on close

// EDIT
if(this.hasOwnProperty("callback"))
callback();
},

//** EDITED
addCallback: function(func) {
this.callback=func;
}

};
}());

// open
m.open();

点击事件自动触发关闭。我想以某种方式将回调插入到要在关闭时执行的 close() 中...我考虑添加一个像

这样的函数
addCallback(callback) { 
this.callback=callback;
}

但我不知道如何在 close() 中调用它。

** 编辑 **

感谢 user3297291 的以下回复和 Barmar,你是对的,我实际上只需要一个回调而不是数组。我通过添加 addCallback() 编辑了上面的代码。那么要运行的代码将是:

m.open()
function check() {
alert("hello");
}

m.addCallback(check);

但这不起作用,我试图理解为什么,而且我是 javascript OO 的新手..

最佳答案

您必须跟踪一组回调(或仅一个)。最简单的实现可能是这样的:

var m = (function() {

var onCloseCallbacks = [];

return {
addOnCloseCallback: function(cb) {
onCloseCallbacks.push(cb);
},

close: function() {
console.log("Closing");
onCloseCallbacks.forEach(function(cb) {
cb();
});
}
};
}());


m.addOnCloseCallback(function() {
console.log("After close");
});

m.close();

请注意,回调数组是在闭包内部定义的。

对于更高级的解决方案,您希望能够从 m 模块外部处理回调。以下是如何添加此内容的示例:

var m = (function() {

var onCloseCallbacks = [];

return {
addOnCloseCallback: function(cb) {
onCloseCallbacks.push(cb);

return {
dispose: function() {
var i = onCloseCallbacks.indexOf(cb);

onCloseCallbacks = onCloseCallbacks
.slice(0, i)
.concat(onCloseCallbacks.slice(i + 1));
}
};

},

close: function() {
console.log("Closing");
onCloseCallbacks.forEach(function(cb) {
cb();
});
}
};
}());


var myCallback = m.addOnCloseCallback(function() {
console.log("After close");
});

m.close(); // Does trigger cb

myCallback.dispose();

m.close(); // Doesn't trigger cb

关于javascript - 向以下模块添加回调的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37617891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com