提问人:Amgad Fahmi 提问时间:2/3/2010 最后编辑:RubénAmgad Fahmi 更新时间:9/27/2021 访问量:376146
在 JavaScript 中创建自定义回调
Create a custom callback in JavaScript
问:
我需要做的就是在当前函数执行结束时执行回调函数。
function LoadData()
{
alert('The data has been loaded');
//Call my callback with parameters. For example,
//callback(loadedData , currentObject);
}
此函数的使用者应如下所示:
object.LoadData(success);
function success(loadedData , currentObject)
{
//Todo: some action here
}
如何实现?
答:
实际上,您的代码几乎可以按原样工作,只需将回调声明为参数,然后可以使用参数名称直接调用它。
基础知识
function doSomething(callback) {
// ...
// Call the callback
callback('stuff', 'goes', 'here');
}
function foo(a, b, c) {
// I'm the callback
alert(a + " " + b + " " + c);
}
doSomething(foo);
这将调用 ,这将调用 ,这将提醒“东西在这里”。doSomething
foo
请注意,传递函数引用 () 非常重要,而不是调用函数并传递其结果 ()。在你的问题中,你做得很正确,但值得指出,因为这是一个常见的错误。foo
foo()
更高级的东西
有时,您希望调用回调,以便它看到 的特定值。您可以使用 JavaScript 函数轻松做到这一点:this
call
function Thing(name) {
this.name = name;
}
Thing.prototype.doSomething = function(callback) {
// Call our callback, but using our own instance as the context
callback.call(this);
}
function foo() {
alert(this.name);
}
var t = new Thing('Joe');
t.doSomething(foo); // Alerts "Joe" via `foo`
您还可以传递参数:
function Thing(name) {
this.name = name;
}
Thing.prototype.doSomething = function(callback, salutation) {
// Call our callback, but using our own instance as the context
callback.call(this, salutation);
}
function foo(salutation) {
alert(salutation + " " + this.name);
}
var t = new Thing('Joe');
t.doSomething(foo, 'Hi'); // Alerts "Hi Joe" via `foo`
有时,将要给回调的参数作为数组传递,而不是单独传递,这很有用。您可以使用以下操作:apply
function Thing(name) {
this.name = name;
}
Thing.prototype.doSomething = function(callback) {
// Call our callback, but using our own instance as the context
callback.apply(this, ['Hi', 3, 2, 1]);
}
function foo(salutation, three, two, one) {
alert(salutation + " " + this.name + " - " + three + " " + two + " " + one);
}
var t = new Thing('Joe');
t.doSomething(foo); // Alerts "Hi Joe - 3 2 1" via `foo`
评论
setTimeout()
doSomething(function(){foo('this','should','work')})
function LoadData(callback)
{
alert('the data have been loaded');
callback(loadedData, currentObject);
}
尝试:
function LoadData (callback)
{
// ... Process whatever data
callback (loadedData, currentObject);
}
函数在 JavaScript 中是一流的;你可以把它们传来传去。
在尝试执行回调之前,最好先确保回调是实际函数:
if (callback && typeof(callback) === "function") {
callback();
}
评论
if(typeof callback == "function")
将产生相同的结果。
callback &&
我的 2 美分。相同但不同......
<script>
dosomething("blaha", function(){
alert("Yay just like jQuery callbacks!");
});
function dosomething(damsg, callback){
alert(damsg);
if(typeof callback == "function")
callback();
}
</script>
评论
function callback(e){
return e;
}
var MyClass = {
method: function(args, callback){
console.log(args);
if(typeof callback == "function")
callback();
}
}
==============================================
MyClass.method("hello",function(){
console.log("world !");
});
==============================================
结果是:
hello world !
function loadData(callback) {
//execute other requirement
if(callback && typeof callback == "function"){
callback();
}
}
loadData(function(){
//execute callback
});
评论
调用回调函数时,我们可以按如下方式使用它:
consumingFunction(callbackFunctionName)
例:
// Callback function only know the action,
// but don't know what's the data.
function callbackFunction(unknown) {
console.log(unknown);
}
// This is a consuming function.
function getInfo(thenCallback) {
// When we define the function we only know the data but not
// the action. The action will be deferred until excecuting.
var info = 'I know now';
if (typeof thenCallback === 'function') {
thenCallback(info);
}
}
// Start.
getInfo(callbackFunction); // I know now
这是带有完整示例的 Codepend。
有些答案虽然正确,但可能有点难以理解。这是一个通俗的例子:
var users = ["Sam", "Ellie", "Bernie"];
function addUser(username, callback)
{
setTimeout(function()
{
users.push(username);
callback();
}, 200);
}
function getUsers()
{
setTimeout(function()
{
console.log(users);
}, 100);
}
addUser("Jake", getUsers);
回调意味着,“Jake”始终在显示用户列表之前添加到用户中。console.log
如果你想在完成某件事时执行一个函数。一个好的解决方案之一是监听事件。
例如,我将用 ES6 实现一个类,然后:Dispatcher
DispatcherEvent
let Notification = new Dispatcher()
Notification.on('Load data success', loadSuccessCallback)
const loadSuccessCallback = (data) =>{
...
}
//trigger a event whenever you got data by
Notification.dispatch('Load data success')
调度:
class Dispatcher{
constructor(){
this.events = {}
}
dispatch(eventName, data){
const event = this.events[eventName]
if(event){
event.fire(data)
}
}
//start listen event
on(eventName, callback){
let event = this.events[eventName]
if(!event){
event = new DispatcherEvent(eventName)
this.events[eventName] = event
}
event.registerCallback(callback)
}
//stop listen event
off(eventName, callback){
const event = this.events[eventName]
if(event){
delete this.events[eventName]
}
}
}
调度程序事件:
class DispatcherEvent{
constructor(eventName){
this.eventName = eventName
this.callbacks = []
}
registerCallback(callback){
this.callbacks.push(callback)
}
fire(data){
this.callbacks.forEach((callback=>{
callback(data)
}))
}
}
祝您编码愉快!
p/s:我的代码缺少处理一些错误异常
function login(email, password, callback) {
//verify the user
const users = [
{ email: "[email protected]", password: "123" },
{ email: "[email protected]", password: "xyz" }
];
const user = users.find(
(user) => user.email === email && user.password === password
);
callback(user);
`enter code here`}
function redirect(user) {
if (user) {
//user is successfully logged in
console.log("user is successfully logged in ");
} else {
console.log("Incorrect credentials ");
}
}
login("[email protected]", "123", redirect);
我希望这个例子能帮助到所有想了解JS回调的人
评论
object.LoadData(success)
call must be after 被定义。否则,您将收到一条错误消息,告诉您未定义该函数。function success