2016-03-22 44 views
0

我有一個函數運行一個for循環,然後在for循環完成後回調它的結果。我的問題是,在這個for循環函數中,我有兩個有回調的函數,他們花費了大約半秒的時間完成(也許更少)。當我用適當的數據進行調用時,我的結果數組在完成後被回調,但是當用戶名是唯一的時候,圖片是相同的,這不是我想要的。我相信這與JS試圖成爲異步的東西有關,但它只是打破了。這裏是我的代碼:for循環中函數回調的問題

function forCallback(rows, callback){ 
    var done = 0; 
    for(i = 0 ;i < rows.length; i++){ 
    var steamid = rows[i].steamid; 
    userinfo.getUserName(steamid, function(name){ 
     userinfo.getUserPicture(steamid, function(picture){ 
     results.push({ 
      name: name, 
      picture: picture 
     }) 
     done++; 
     console.log("Queried " + done + " username(s)") 
     if(done == (rows.length)){ 
      callback(results); 
     } 
     }); 
    }); 
    } 
} 

該函數需要SQL行並解析數據,如果你想知道。任何幫助表示讚賞,非常感謝!

+0

你有沒有嘗試在IFFE中包裝循環的東西? – JordanHendrix

+0

看看這個解釋(閉環裏面的段落):http://bonsaiden.github.io/JavaScript-Garden/#function.closures – wawawoom

回答

4

問題是,您的異步功能正在捕獲對steamid的引用,並且該值隨着for循環的繼續而變化。相反,您需要捕獲steamid的值,並確保該值在本地回調。你可以使用IIFE.

for (var i = 0; i < rows.length; i++) { 
    (function(steamid) { 
    userinfo.getUserName(steamid, function(name) { 
     ... 
    }); 
    })(rows[i].steamid); 
} 
+1

非常感謝:D –