打字稿lambda和闭包(范围)

时间:2016-05-18 03:55:18

标签: lambda typescript closures

我为多个用户加载了一些数据,我想将它存储到一个javascript数组中。 在纯打字稿中,我会这样写:

for(var i = 0; i < 5; i++) {
   promise[i] = httpquery.then( 
     (data) => { this.usersData[i] = data }
   );
)

...

this.$q.all[promise].then(......

不幸的是,我的打字稿lambda只保护这个(而不是变量i)。所以在我的情况下,它总是将数据存储在this.usersData [5]中。

是的,我需要一个闭包,就我理解这个打字稿的语言部分而言,lambda表达式的作用有点类似于闭包。

所以让我们尝试使用Typescript做一些事情:

for(var i = 0; i < 5; i++) {
   promise[i] = (index = i) => {
       return httpquery.then( 
          (data) => { this.usersData[index] = data }
       );
   }();
)

根本不起作用(甚至不编译)。为什么?因为似乎()=&gt; {}不是真正的功能。我用这种方式解决了这个问题:

for(var i = 0; i < 5; i++) {
   var getData = (index = i) => {
       return httpquery.then( 
          (data) => { this.usersData[index] = data }
       );
   };
   promise[i] = getData();
)

我觉得不是很漂亮:-p。 所以我的问题是:如何处理这个问题?像我一样?或者有一种方法可以更美妙的方式在打字稿中使用lambda? 为什么

 () => {}() 

没有工作但是

 var test = () => {}; 
 test(); 

有效吗?它是因为打字稿编译器不是&#34; smart&#34;足以理解lambda是一个函数吗?

感谢。

1 个答案:

答案 0 :(得分:2)

之所以:

promise[i] = (index = i) => {
  return httpquery.then( 
    (data) => { this.usersData[index] = data }
  );
}();

没有解析是因为它不是有效的JavaScript(var x = a => { return a + 1; }(3)在JavaScript和TypeScript中都是SyntaxError。只需包装lambda在括号中足以使它成为一个有效的表达式。

但是,这样做不会解决您的捕获问题 - 默认参数会在每次调用时进行评估,因此它们都会指向var的最终边界值。

相反,你可以:

A)切换到初始化程序中使用let(在这种情况下,TypeScript会自动执行正确的操作:

for(let i = 0; i < 5; i++) {
  promise[i] = httpquery.then(data => this.usersData[i] = data);
}

B)自己手动创建闭包:

for(var i = 0; i < 5; i++) {
  promise[i] = (index => httpquery.then(data => this.usersData[index] = data))(i);
}