将参数传递给回调函数

时间:2014-10-20 07:34:03

标签: javascript

我试图绕过javascript回调函数。我尝试了以下代码:

var callbackTester = function(callback) {
  var tryMe = "Are you ready, ";
  callback(tryMe);
}

var createMessageHandler = function(client) {
  this.client = client;
  this.result = function(foo){
    console.log(foo + " "+ this.client);
  }
};

(new createMessageHandler("John")).result(callbackTester);

而不是"你准备好了,Jason",我得到了整个回调函数,后跟名字:

function (callback) {
  var tryMe = "Are you ready, ";
  callback(tryMe);
} John

有人可以帮我理解如何解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您的foo参数不是字符串,而是您需要调用的回调函数。其中一个可能的解决方案是:

var callbackTester = function (callback) {
    var tryMe = "Are you ready, ";
    callback(tryMe);
};

var createMessageHandler = function (client) {
    this.client = client;
    this.result = function (foo) {
        foo(function (msg) {
            console.log(msg + " " + this.client);
        }.bind(this));
    }
};

(new createMessageHandler("John")).result(callbackTester);

介意.bind(this) - 您需要这样做才能将this.client保留在外部范围内。

有关bind功能的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

注意:我不太了解您的代码的目的。 Aren你进入了一个回调地狱吗?尝试monads / promises。

new createMessageHandler并不直观。恕我直言,它应该是new MessageHandler()createMessageHandler()

答案 1 :(得分:0)

你定义了一个callbackTester函数,它将回调作为参数,所以你必须给它一个回调,否则它将永远不会工作。此外,您必须return回调。否则你永远不会得到任何东西,除了功能本身。这是一个解决方案:

var callbackTester = function(callback) {
    var tryMe = "Are you ready,";
    return callback(tryMe);
}

var createMessageHandler = function(client) {
    this.client = client;
    this.result = function(foo){
        console.log(foo + " "+ this.client);
    }
}

(new createMessageHandler("John")).result(callbackTester(function(phrase) { return phrase; }));
// Are you ready, John