2016-03-22 19 views
0

forループを実行し、終了後にforループの結果をコールバックする関数があります。私の問題は、このforループ関数では、コールバックを持っている2つの関数があり、それらが両方とも終了する(おそらくそれ以下)ために約0.5秒かかるということです。適切なデータで呼び出しを行うと、結果配列は終了後に呼び出されますが、ユーザー名は一意ですが、画像は同じで、私が望んでいないものです。私はこれが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

このexplantion(ループ内の段落Closures)を見てください: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 –