2016-05-18 89 views
2

我加載了一些數據爲多個用戶,我想將它存儲到一個JavaScript數組。 在純打字稿,我會寫這樣的:打字稿lambdas和封閉(範圍)

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

... 

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

不幸的是,我的打字稿拉姆達保護僅此(而不是變量i)。所以在我的情況下,它總是將數據存儲在this.usersData [5]中。

對,我需要一個閉包,而且據我瞭解這個打字稿的部分語言,lambda表達式有點類似於閉包。

所以讓我們嘗試做一些與打字稿:

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

這在所有(甚至編譯)無法正常工作。爲什麼?因爲似乎那()=> {}不是一個真正的函數。我通過這種方式解決了這個問題:

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(); 

的作品?這是因爲typecript編譯器不夠「聰明」,不足以理解lambda是一個函數嗎?

謝謝。

回答

2

的原因所在:

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

解析是因爲它不是有效的JavaScript(var x = a => { return a + 1; }(3)是在JavaScript以及打字稿一個SyntaxError只需在括號包裹拉姆達足以使其成爲一個有效的表達式

但是,只是這樣做不會解決您的捕獲問題 - 每次調用都會計算默認參數,因此它們都將指向var的最終綁定值。

相反,你可以:

A)切換到你的初始使用let(在這種情況下,打字稿會自動做正確的事情:

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

確實,使用let是最美的解決方案。我仍然使用var,並沒有花時間看let/const,我認爲是改變這種壞習慣的適當時機。 謝謝! – Adavo