Я пытаюсь получить некоторые данные из API OpenWeatherMap. Когда я отправляю запрос с требуемым ключом API и данными о местоположении, все возвращается обратно нормально. Возвращенные данные отображаются в формате JSON. Однако, когда я выполняю функцию JSON.parse() над строкой, она выдает ошибку "неожиданный конец ввода".
Одна вещь, которая мне показалась интересной, заключалась в том, что если я должен был сохранить строку в переменной, а затем приступить к выполнению функции в консоли отладки Chrome, то все в порядке.
let jsonData;
let jsonActual;
function GetWeather(city, country){
Http = new XMLHttpRequest();
Http.open("GET", weatherUrl + city + "," + country + weatherKey);
Http.send();
Http.onreadystatechange=(e)=>{
jsonData = Http.response;
jsonActual = JSON.parse(jsonData.toString());
}
}
При использовании консоли:
x = JSON.parse(jsonData) // Completes successfully
В вашей функции onreadystatechange
вас есть
Http.onreadystatechange=(e)=>{
jsonData = Http.response;
jsonActual = JSON.parse(jsonData.toString());
}
Попробуйте сделать это вместо этого:
Http.onreadystatechange=(e)=>{
if (this.readyState === 4) {
jsonData = Http.response;
jsonActual = JSON.parse(jsonData.toString());
}
}
Ваш readyState
никогда не проверяется, если он complete
:
Http.onreadystatechange = e => {
if (this.readyState == "complete") {
jsonData = Http.response;
jsonActual = JSON.parse(jsonData.toString());
}
}
Вы также можете проверить против 4
:
Http.onreadystatechange = e => {
if (this.readyState == 4) {
jsonData = Http.response;
jsonActual = JSON.parse(jsonData.toString());
}
}
res.json()
возвращает проанализированный массив / объект ... бессмысленно JSON.parse () это
readyState
в своемonreadystatechange
событияonreadystatechange
. Ответ будет завершен только тогда , когдаreadyState
являетсяcomplete
.