在JavaScript中创建自定义回调

Amg*_*hmi 315 javascript

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

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

此功能的消费者应该是这样的:

object.LoadData(success);

function success(loadedData , currentObject) 
{
  //Todo: some action here 
}
Run Code Online (Sandbox Code Playgroud)

我该如何实现?

T.J*_*der 565

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

基础

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);
Run Code Online (Sandbox Code Playgroud)

这将打电话doSomething,这将打电话foo,这将提醒"东西在这里".

请注意,传递函数reference(foo)非常重要,而不是调用函数并传递其result(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`
Run Code Online (Sandbox Code Playgroud)

你也可以传递参数:

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`
Run Code Online (Sandbox Code Playgroud)

有时,传递您想要将回调作为数组的参数,而不是单独传递是有用的.你可以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`
Run Code Online (Sandbox Code Playgroud)

  • @everyone回答:我认为TiTaN的问题在于他不知道如何将需要参数的函数传递给不传递任何参数的回调.想想`setTimeout()`.答案是将回调包装在一个闭包中:`doSomething(function(){foo('this','should','work')})` (4认同)

小智 75

在尝试执行回调之前,确保回调是实际函数是一种好习惯:

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

  callback();
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是如果没有回调,为什么还要打扰呢?这就是'回调&&'的意思...... (22认同)
  • `if(typeof callback =="function")`将具有相同的结果. (20认同)

K. *_*erg 57

我2分.相同但不同......

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


    function dosomething(damsg, callback){
        alert(damsg);
        if(typeof callback == "function") 
        callback();
    }
</script>
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个片段,我正在寻找这个 (7认同)

aru*_*hal 9

function loadData(callback) {

    //execute other requirement

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

loadData(function(){

   //execute callback

});
Run Code Online (Sandbox Code Playgroud)

  • 请考虑编辑您的帖子,以添加有关您的代码的功能以及解决问题的原因的更多说明.一个主要只包含代码的答案(即使它正在工作)通常不会帮助OP理解他们的问题.然而,在这种情况下,这是一个非常古老的问题,已经发布了高度重视的答案,当有更新的问题可以做更多关注时,可能不值得你回答这个问题. (6认同)

Eya*_*rra 5

   function callback(e){
      return e;
   }
    var MyClass = {
       method: function(args, callback){
          console.log(args);
          if(typeof callback == "function")
          callback();
       }    
    }
Run Code Online (Sandbox Code Playgroud)

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

MyClass.method("hello",function(){
    console.log("world !");
});
Run Code Online (Sandbox Code Playgroud)

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

结果是:

hello world !
Run Code Online (Sandbox Code Playgroud)