尝试使用带参数的闭包作为回调

时间:2014-12-04 11:20:35

标签: javascript

我有一个我从一个方法调用的库函数。它需要一个带有一个参数的回调,我希望它是来自同一个对象的另一个方法。我似乎无法正确使用语法。这就是我所拥有的:

myOriginalObject.login = function() {
    // inside a method
    var obj = this;
    var closure = function(token) { return function() { obj._login2(token); } }
    $window.gapi.auth.authorize({"client_id": this.clientId,
                                 "immediate":false,
                                 "response_type":"token",
                                 "scope":this.scopes}, closure );       

    // .. some more code and method ends
}
myOriginalObject._login2 = function(authResult)
{
  // .. I can't get this function called by the gapi library
}

P.S。对不起,如果这篇文章做得不好(还在学习)谢谢!!!

2 个答案:

答案 0 :(得分:0)

您已将closure功能的引用传递给authorize,但我认为您希望调用并将引用传递给它创建的函数。所以:

// `token` argument here ------------------v
var closure = function() { return function(token) { obj._login2(token); } }
// not here------------^

$window.gapi.auth.authorize({"client_id": this.clientId,
                             "immediate":false,
                             "response_type":"token",
                             "scope":this.scopes}, closure() );
// Call it -----------------------------------------------^^

您可能根本不需要closure功能,但在不了解周围代码的情况下很难说清楚。但这可能就是你所需要的:

$window.gapi.auth.authorize({"client_id": this.clientId,
                             "immediate":false,
                             "response_type":"token",
                             "scope":this.scopes}, function(token) {
                                 obj._login2(token);
                             });

旁注:由于myOriginalObject是单身,因此您不需要var obj = this;,您可以直接使用符号myOriginalObject

$window.gapi.auth.authorize({"client_id": this.clientId,
                             "immediate":false,
                             "response_type":"token",
                             "scope":this.scopes}, function(token) {
                                 myOriginalObject._login2(token);
                             });

答案 1 :(得分:0)

这一行:

var closure = function(token) { return function() { obj._login2(token); } }

将返回一个函数,即closure()的返回值是一个函数。

一个解决方案:

变化

var closure = function(token) { return function() { obj._login2(token); } }

var closure = function(token) { obj._login2(token); }