serve - Crie um retorno de chamada personalizado em JavaScript




javascript pdf (7)

É uma boa prática certificar-se de que o retorno de chamada seja uma função real antes de tentar executá-lo:

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

  callback();
}

https://code.i-harness.com

Tudo o que preciso fazer é executar uma função de retorno de chamada quando a execução da função atual terminar.

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

Um consumidor para esta função deve ser assim:

object.LoadData(success);

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

Como faço para implementar isso?


Algumas das respostas, embora corretas, podem ser um pouco complicadas de entender. Aqui está um exemplo em termos leigos:

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

O retorno de chamada significa que "Jake" é sempre adicionado aos usuários antes de exibir a lista de usuários com console.log .

Fonte (YouTube)


Experimentar:

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

Funções são de primeira classe em JavaScript ; você pode simplesmente passá-los.


Meus 2 cêntimos Mesmo mas diferente ...

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


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

Se você quiser executar uma função quando algo é feito. Uma das boas soluções é ouvir os eventos. Por exemplo, implementarei um Dispatcher , uma classe DispatcherEvent com ES6 e, em seguida:

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

Expedidor:

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

Codificação feliz!

p / s: meu código está faltando manipular algumas exceções de erro


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

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

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

Resultado é:

hello world !






javascript