在 JavaScript 中创建自定义回调

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2190850/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-22 23:10:52  来源:igfitidea点击:

Create a custom callback in JavaScript

javascript

提问by Amgad Fahmi

All I need to do is to execute a callback function when my current function execution ends.

我需要做的就是在当前函数执行结束时执行回调函数。

function LoadData() 
{
    alert('The data has been loaded');
    //Call my callback with parameters. For example,
    //callback(loadedData , currentObject);
}

A consumer for this function should be like this:

这个函数的消费者应该是这样的:

object.LoadData(success);

function success(loadedData , currentObject) 
{
  //Todo: some action here 
}

How do I implement this?

我该如何实施?

回答by T.J. Crowder

Actually, your code will pretty much work as is, just declare your callback as an argument and you can call it directly using the argument name.

实际上,您的代码几乎可以按原样工作,只需将您的回调声明为参数,您就可以使用参数名称直接调用它。

The basics

基础知识

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);

That will call doSomething, which will call foo, which will alert "stuff goes here".

那将调用doSomething,它将调用foo,它会提醒“东西到这里了”。

Note that it's very important to pass the function reference(foo), rather than calling the function and passing its result (foo()). In your question, you do it properly, but it's just worth pointing out because it's a common error.

请注意,传递函数引用( foo)非常重要,而不是调用函数并传递其结果 ( foo())。在你的问题中,你做得对,但值得指出,因为这是一个常见的错误。

More advanced stuff

更高级的东西

Sometimes you want to call the callback so it sees a specific value for this. You can easily do that with the JavaScript callfunction:

有时您想调用回调,以便它看到 的特定值this。您可以使用 JavaScriptcall函数轻松做到这一点:

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`

You can also pass arguments:

您还可以传递参数:

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`

Sometimes it's useful to pass the arguments you want to give the callback as an array, rather than individually. You can use applyto do that:

有时,将要提供给回调的参数作为数组而不是单独传递很有用。你可以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`

回答by Donald A Nummer Jr

It is good practice to make sure the callback is an actual function before attempting to execute it:

在尝试执行之前确保回调是一个实际的函数是一种很好的做法:

if (callback && typeof(callback) === "function") {

  callback();
}

回答by K. Kilian Lindberg

My 2 cent. Same but different...

我的2美分。相同但不同...

<script>
    dosomething("blaha", function(){
        alert("Yay just like jQuery callbacks!");
    });


    function dosomething(damsg, callback){
        alert(damsg);
        if(typeof callback == "function") 
        callback();
    }
</script>

回答by arun bahal

function loadData(callback) {

    //execute other requirement

    if(callback && typeof callback == "function"){
        callback();
   }
}

loadData(function(){

   //execute callback

});

回答by Eyad Farra

   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 !");
});

==============================================

==============================================

Result is:

结果是:

hello world !

回答by hien

If you want to execute a function when something is done. One of a good solution is to listen to events. For example, I'll implement a Dispatcher, a DispatcherEventclass with ES6,then:

如果你想在某事完成时执行一个函数。一个好的解决方案是监听事件。例如,我将使用 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')

Dispatcher:

调度员:

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]
    }
  }
}

DispatcherEvent:

调度器事件:

class DispatcherEvent{
  constructor(eventName){
    this.eventName = eventName
    this.callbacks = []
  }

  registerCallback(callback){
    this.callbacks.push(callback)
  }

  fire(data){
    this.callbacks.forEach((callback=>{
      callback(data)
    }))
  }
}

Happy coding!

快乐编码!

p/s: My code is missing handle some error exceptions

p/s: 我的代码丢失处理一些错误异常

回答by Eric Tan

When calling the callback function, we could use it like below:

在调用回调函数时,我们可以像下面这样使用它:

consumingFunction(callbackFunctionName)

consumingFunction(callbackFunctionName)

Example:

例子:

// 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

This is the Codependwith full example.

这是带有完整示例的Codepend

回答by Dan Bray

Some of the answers, while correct may be a little tricky to understand. Here is an example in layman's terms:

一些答案虽然正确,但可能有点难以理解。这是一个通俗易懂的例子:

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);

The callback means, "Jake" is always added to the users before displaying the list of users with console.log.

回调意味着“Jake”总是在显示用户列表之前添加到用户中console.log

Source (YouTube)

来源(YouTube)

回答by Thomas Bonini

function LoadData(callback) 
{
    alert('the data have been loaded');
    callback(loadedData, currentObject);
}

回答by K Prime

Try:

尝试:

function LoadData (callback)
{
    // ... Process whatever data
    callback (loadedData, currentObject);
}

Functions are first class in JavaScript; you can just pass them around.

函数是JavaScript中的第一类;你可以把它们传递出去。