代码之家  ›  专栏  ›  技术社区  ›  Amgad Fahmi

在javascript中创建自定义回调

  •  303
  • Amgad Fahmi  · 技术社区  · 14 年前

    我只需要在当前函数执行结束时执行回调函数。

    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 
    }
    

    我如何实现这一点?

    10 回复  |  直到 14 年前
        1
  •  541
  •   T.J. Crowder    8 年前

    实际上,您的代码基本上可以正常工作,只需将回调声明为一个参数,就可以使用参数名直接调用它。

    基础知识

    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() )在你的问题中,你做得很好,但是值得指出的是,这是一个常见的错误。

    更高级的东西

    有时您希望调用回调,以便它看到 this . 使用JavaScript可以很容易地做到这一点 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`
    
        2
  •  71
  •   Donald A Nummer Jr    11 年前

    在尝试执行回调之前,最好确保它是一个实际函数:

    if (callback && typeof(callback) === "function") {
    
      callback();
    }
    
        3
  •  55
  •   K. Kilian Lindberg    11 年前

    我的2分钱。相同但不同…

    <script>
        dosomething("blaha", function(){
            alert("Yay just like jQuery callbacks!");
        });
    
    
        function dosomething(damsg, callback){
            alert(damsg);
            if(typeof callback == "function") 
            callback();
        }
    </script>
    
        4
  •  9
  •   AlexB borjafp    9 年前
    function loadData(callback) {
    
        //execute other requirement
    
        if(callback && typeof callback == "function"){
            callback();
       }
    }
    
    loadData(function(){
    
       //execute callback
    
    });
    
        5
  •  4
  •   Ahmet Can Güven    10 年前
       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 !
    
        6
  •  1
  •   tinlyx    10 年前
    function LoadData(callback) 
    {
        alert('the data have been loaded');
        callback(loadedData, currentObject);
    }
    
        7
  •  1
  •   Eric Tan    7 年前

    调用回调函数时,我们可以使用它,如下所示:

    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 举个例子。

        8
  •  1
  •   hien    6 年前

    如果您想在完成某件事情时执行一个函数。一个好的解决办法是听事件。 例如,我将实现 Dispatcher A DispatcherEvent 用ES6分类,然后:

    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:我的代码丢失处理一些错误异常

        9
  •  0
  •   Peter Mortensen Sumit Kumar    11 年前

    尝试:

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

    函数是 JavaScript 你可以把它们传过去。

        10
  •  0
  •   Dan Bray    6 年前

    有些答案,虽然正确可能有点难理解。下面是一个外行术语的例子:

    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 .

    Source (YouTube)