2016-03-22 3 views
0

У меня есть функция, которая запускает цикл for и затем возвращает результаты цикла for после его завершения. Моя проблема заключается в том, что в этой функции цикла у меня есть 2 функции назад, которые имеют обратные вызовы, и они занимают около половины секунды, чтобы они закончили (возможно, меньше). Когда я делаю вызов с надлежащими данными, мой массив результатов вызывается назад после его завершения, однако, пока имена пользователей уникальны, изображения идентичны, что не то, что я хочу. Я считаю, что это имеет какое-то отношение к 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 –

Смежные вопросы