У меня есть карта Google, которая отображает маркеры с информацией о долготе и широте с веб-страницы, которая анализируется функцией makeRequest. На данный момент маркеры размещаются с помощью вызова displayLocation путем вызова makeRequest. Точные маркеры, которые мне нужны, помещаются на карту. Моя проблема заключается в том, чтобы предоставить более подробную информацию для информационного окна маркера карты.
Я не понимаю область действия переменной ParticipantName. Когда я передаю имя участника через вызов makeRequest, я получаю последнее имя участника в массиве, который заполняется в информационном окне каждого маркера.
Половина моей цели выполнена, где каждый маркер уникален для идентификатора участника (long, lat). Я хочу пройти через другой массив с именами участников и заполнить их вместе с каждым соответствующим маркером.
Выходные данные цикла отображают фамилию в массиве, в то время как должно отображать значение в memberNames [i] в массиве, соответствующем первому циклу for.
var participantIDs = <?php echo json_encode($participantIDs) ?>;
var participantNames = <?php echo json_encode($participantNames)?>;
var participantID;
var participantName;
for(var i = 0; i < participantIDs.length; i++)
{
participantID = participantIDs[i];
participantName = participantNames[i];
makeRequest('pageWithLocationInfo.php?participantID=' + participantID , function(data)
{
var data = JSON.parse(data.responseText);
for(var i = 0; i < data.length; i++)
{
displayLocation(data[i], participantName);
}
});
}
}
function displayLocation(location, pName) {
var content = '<div class = "infoWindow">' + '<p>' + pName + '<br/>' + 'Latitude: ' + location.latitude
+ '<br/>' + 'Longitude: ' + location.longitude + '</p>'
+ '</div>';
}
Мне кажется, что я так близок к получению результата, что просто упускаю небольшую деталь. Не совсем понимаю, как каждому маркеру присваивается имя участника [8], когда я передаю имя участника [1], [2], [3] .... Использование статической строки membersantName = "Test" присваивает всем маркерам символ " Название теста.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Похоже, вы хотите, чтобы каждая итерация имела отдельную привязку для participantID и participantName. Поскольку var имеет область действия и поднимается, вам следует использовать вместо него const или let. Или, что еще лучше, полностью избегайте циклов for и используйте forEach, который не требует ручной итерации и имеет автоматическую абстракцию. Попробуйте что-то вроде этого:
const participantIDs = <?php echo json_encode($participantIDs) ?>;
const participantNames = <?php echo json_encode($participantNames)?>;
participantIDs.forEach((participantID, i) => {
const participantName = participantNames[i];
makeRequest('pageWithLocationInfo.php?participantID=' + participantID, function(response) {
const data = JSON.parse(response.responseText);
data.forEach(item => displayLocation(item, participantName));
});
});
Более уродливым решением было бы просто использовать let в ваших циклах, у которого есть область видимости блока (с которой легко взаимодействовать), а не область действия (с которой сложнее взаимодействовать):
var participantIDs = <?php echo json_encode($participantIDs) ?>;
var participantNames = <?php echo json_encode($participantNames)?>;
for (let i = 0; i < participantIDs.length; i++) {
const participantID = participantIDs[i];
const participantName = participantNames[i];
makeRequest('pageWithLocationInfo.php?participantID=' + participantID, function(dataR) {
const data = JSON.parse(dataR.responseText);
for (var j = 0; j < data.length; j++) {
displayLocation(data[j], participantName);
}
});
}
Не используйте одно и то же имя переменной индекса итерации как для внутреннего, так и для внешнего цикла; используйте разные имена.
Вы можете попробовать следующее и рассказать мне, каков результат. Также необходимо знать, как makeRequest указывает на неисправность.
var participantIDs = [];
var participantNames = [];
if (participantIDs.length!==participantNames.length){
throw new Error("participants id's and names are not the same length");
}
Promise.all(
participantIDs.map(//map names and id's to [[id,name],[id,name]]
function(id,index){
return [id,participantNames[index]]
}
).map(
function(idName){//in ES7 you can use ([id,name])=>new Promise...
return new Promise(
function(resole,reject){
makeRequest(//What does makeRequest return to indicate failure?
"pageWithLocationInfo.php?participantID = " + idName[0],
function(data){
resolve(data);
}
)
}
).then(
function(response){
var data = JSON.parse(response.responseText);
data.forEach(function(location){
displayLocation(location, idName[1]);
})
return [data,idName];
}
)
}
)
).then(
function(results){
console.info("results is:",results)
}
)
Динамическое создание подобного Javascript - не лучшая идея - вам, вероятно, будет намного проще отлаживать, если вы обслуживаете данные отдельно, а затем ваш (статический, автономный) скрипт считывает данные.