Отладка передачи переменной Javascript

У меня есть карта 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>';

                }

Динамическое создание подобного Javascript - не лучшая идея - вам, вероятно, будет намного проще отлаживать, если вы обслуживаете данные отдельно, а затем ваш (статический, автономный) скрипт считывает данные.

CertainPerformance 25.04.2018 05:54

Мне кажется, что я так близок к получению результата, что просто упускаю небольшую деталь. Не совсем понимаю, как каждому маркеру присваивается имя участника [8], когда я передаю имя участника [1], [2], [3] .... Использование статической строки membersantName = "Test" присваивает всем маркерам символ " Название теста.

Scrambulance 25.04.2018 06:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
30
2

Ответы 2

Похоже, вы хотите, чтобы каждая итерация имела отдельную привязку для 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)
  }
)

Другие вопросы по теме