Цикл for
не создает новую область видимости. Поэтому переменная request одна для всех итераций. Из-за таймаута, эмулирующего задержку ответа сервера, на момент вызова callback в переменной будет одно и то же значение - '/populations', что рушит дальнейшую логику со всеми вытекающими.
- Замыкания
Array.prototype.forEach()
- Использовать
let request = requests[i]
из ECMAScript 6, тем самым объявляя request с блочной областью видимости
- Использовать механизм событий
- Использовать Promises
Первая часть задания - исправить код. В качестве исправления выбрал замыкание. Вторая часть - считать население конкретной страны или города. В качестве демонстрации подхода, который поможет избежать проблем связанных с задержкой ответа сервера выбран механизм Promises, а в качестве реализации Promises выбрана Q library, вообще, в ECMAScript 6 есть версия работающая "из коробки".