2016-11-15 44 views
0

重述:在打字稿方法外部化的功能,同时保持闭合

一个常见的模式是通过回调函数,例如与猫鼬的save(只是举例和简化的 - 没有错误处理):

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。看起来没有办法做到这一点,所以我会活着包装它。

我的原始问题是试图隔离我感兴趣的具体问题 - 哪些是隐式访问调用者的变量。看起来这不是可能的。很公平。

原题:

我想外部化一点的代码,我经常使用的,我有麻烦的打字稿方法的上下文中理解关闭。请看:

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()功能不。 thistest未定义。删除this以匹配内联函数并没有帮助。

我相信,如果我是对this绑定呼叫我只是给Handler类的引用结束时,我真的想在post方法绑定。

我这样做的动机是我想做一个函数,可以作为回调传递给一堆不同的请求处理程序。当我编写内联函数时,它一切正常,但是当我将它外化时,我无法获得封闭方法中变量的闭包。我读过“你不知道JS:这个&对象原型”,并在纯Javascript中我可以设法使这些事情的工作,但我显然在这里做错了事情(它可能不是Typescript相关,也许我只是搞砸了)。

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

+0

提示:http://stackoverflow.com/questions/4472529/accessing-variables-trapped-by-closure –

+0

另外,有与打字稿无关。 –

+0

我可能会想念它,但这是我想要做的内心的一种。我不是试图从一个闭包中提取对一个变量的访问,我试图通过调用方法获得一个闭包。我正在从内向外看,而不是从外到内。 – WillyC

回答

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); 
    }   
} 
+0

它完全不清楚你要问什么,在你张贴的片段中有太多的概念性错误可以轻松解开。 IIFE将在函数定义时被调用,但由于它没有被调用,所以函数的参数不会被调用,这意味着代码*应该在那一点上抛出。动态范围?没有编程语言,因为elisp已经使用动态范围,而隐式'this'参数是根据调用对象动态分配的,因此不涉及范围。 –