在Typescript方法中外化函数,同时保持闭包

时间:2016-11-15 19:07:54

标签: javascript closures

重述:

一种常见的模式是传递回调函数,例如使用Mongoose的保存(仅作为示例和简化 - 无错误处理):

someMethod(req:Request, res:Response){
    document.save( function(err){ res.status(200).send({message: 'all good'})});
}

我希望将回调外部化。你可以这样做:

var respond = function(err:any, res:Response){
    res.status(200).send({message: 'all good'});
}

someMethod(req:Request, res:Response){
    document.save( function(err){ respond(err, res)});
}

...但理想情况下,我想通过传递像respond这样的函数来做到这一点,而不必创建一个回调函数来封装respond。我想知道这是否可行。由于匿名函数可以访问res,我认为可能有某种方法可以在外部定义的函数中访问res。似乎没有办法做到这一点,所以我会生活在包装它。

我最初的问题是试图找出我感兴趣的具体问题 - 这是隐含地访问调用者的变量。似乎没有可能。很公平。

原始问题:

我希望将我经常使用的一些代码外部化,并且我在Typescript方法的上下文中无法理解闭包。看看:

var test = function(){
    console.log("Testing external: "+JSON.stringify(this.req.body));
}

class Handler {

    static post(req: Request, res: Response){
        (function(){
            console.log("TESTING anon: "+JSON.stringify(req.body));
        }) ();
        test();            
    }
}

除了这没有任何用处之外,在这段代码中,内联匿名函数可以访问req对象,但test()函数却没有。 this中的test未定义。删除this以匹配内联函数并不起作用。

我相信如果我要this绑定电话,那么当我真的想要绑定Handler时,我最后会引用post类。方法。

我这样做的动机是我想创建一个可以作为回调传递给一堆不同请求处理程序的函数。当我编写内联函数时,它都可以工作,但是当我将其外化时,我无法对封闭方法中的变量进行闭包。我读过"你不知道JS:这个&对象原型" ,在纯Javascript中我可以设法使这些事情有效但我在这里显然做错了(它可能不是与打字稿相关的,也许我只是...搞砸了。)

所以底线 - 是否有一种方法可以外化处理程序并获取对方法变量的访问权限,就像我在内联编写它一样?我可以创建一个内联匿名函数作为回调,用我需要的所有变量调用外部函数,但我想真正理解这里发生了什么。

1 个答案:

答案 0 :(得分:0)

这不是一个答案,但希望能给我足够的反馈给你一个,因为它根本不清楚你在这里实际想要完成什么以及你是否真正理解这些术语的含义是什么打开问题,因为你正确地使用它们一分钟,并粗略地使用它们。

var test = function(){
    console.log("Testing external: " + JSON.stringify(this.req.body));
}

strict mode中,这会抛出一个错误,在草率中会尝试访问全局对象的req属性,这可能不是您想要的。

(function(){
    console.log("TESTING anon: "+JSON.stringify(req.body));
}) ();

IFFE包装器是完全没必要的,它实际上不会给派对增加任何东西。那么为什么要包含它?

static post(req: Request, res: Response){
    console.log("TESTING anon: "+JSON.stringify(req.body));
    test(); // is this the spot where you are 'in-lining?'   
}

我想要你想要的是:

var test = function(reqBody) {
    console.log("Testing external: " + JSON.stringify(reqBody));
};

class Handler {
    static post(req: Request, res: Response) {
        test(req.body);
    }         
}