2014-10-20 280 views
0

我正在尝试围绕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); 

而不是“你准备好了,杰森”,我得到了整个回调函数出现,随后出现的名字:

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

有人可以帮助我了解如何解决这个问题?

+0

因此,'结果'采用函数'foo','foo +'将stringify函数。 – elclanrs 2014-10-20 07:35:14

+0

在'this.result'里面你实际上没有叫'foo'。 – 2014-10-20 07:35:47

回答

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

注:我不太明白你的代码的目的虽然。你没有进入回调地狱吗?请尝试monads/promise。

new createMessageHandler不直观。恕我直言,它应该不包括new MessageHandler()或只是createMessageHandler()

+0

感谢您的澄清。我刚开始使用JS,很快就会看到承诺。 – jasonng 2014-10-20 10:01:16

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 
+0

@MarcoBonelli我收到“TypeError:createMessageHandler不是构造函数”错误。 – jasonng 2014-10-20 08:17:15