2013-08-02 79 views
0

我有一個循環異步回調的問題。我在Window的文件對象之一上調用一個異步函數來獲取關於它的更多信息(getImagePropertiesAsync()),並將它們保存到數據庫中以加快訪問速度。我需要該函數返回的值以及當我調用getImagePropertiesAsync()時的值i如何在獲取調用函數返回的內容時將局部變量傳遞給回調函數?

for (var i = 0; i < picsGiven.length; i++) { 
    picsGiven[i].properties.getImagePropertiesAsync().then(function(prop){ 
    settings.values["geoLat" + i2] = props.latitude; 
    settings.values["geoLon" + i2] = props.longitude; 
    settings.values["geoDate" + i2] = props.dateTaken; 
    i2++; 
    }) 
} 

由於異步執行,對三個值按錯誤順序保存。當我寫這篇文章時,我已經擔心這個問題。下一次嘗試。現在

for (var i = 0; i < picsGiven.length; i++) { 
    picsGiven[i].properties.getImagePropertiesAsync().then((function(prop, i2){ 
    settings.values["geoLat" + i2] = props.latitude; 
    settings.values["geoLon" + i2] = props.longitude; 
    settings.values["geoDate" + i2] = props.dateTaken; 
    })(undefined, i)) 
} 

,我i正確的,但props是不確定的。 (邏輯)。

我怎麼可能得到i正確,同時保留props?提前致謝!

+1

的可能重複[關閉的Javascript內循環 - 簡單實用的例子(HTTP:// stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) –

回答

1

(未經測試)是這樣的:

function mk_handleImagePropertiesAsync(ival) { 
    return function(prop) { 
    settings.values["geoLat" + ival] = prop.latitude; 
    settings.values["geoLon" + ival] = prop.longitude; 
    settings.values["geoDate" + ival] = prop.dateTaken; 
    } 
} 

for (var i = 0; i < picsGiven.length; i++) { 
    picsGiven[i] 
    .properties 
    .getImagePropertiesAsync() 
    .then(mk_handleImagePropertiesAsync(i)); 
} 

範圍界定問題! for循環不像C/C++那樣引入新的塊範圍。在循環內聯函數總是會得到i2的相同的值(!它的初始值)

+0

感謝您的快速回答。我正在嘗試,但運行這可能需要一些時間... – Martin

0

試試這個

for (var i = 0; i < picsGiven.length; i++) { 
     picsGiven[i].properties.getImagePropertiesAsync().then(function(i){ 
      return function(prop){ 
       //your code here you can use i 
      } 
     }(i)); 
    } 
相關問題