Создать таблицу данных из данных API - javascript, JQuery, ajax

Я пытаюсь создать таблицу из API, используя JQuery в javascript, я новичок в этом языке, и мне непонятно, как получить доступ к данным, которые возвращаются из запроса .ajax.

В приведенном ниже коде я могу получить данные и вернуть их в консоль, но когда я пытаюсь установить переменную для визуализации, я получаю сообщение об ошибке:

"<a class='gotoLine' href='#65:39'>65:39</a> Uncaught ReferenceError: data is not defined"

Есть ли шаг, который мне не хватает, чтобы установить переменную data на что-то, к чему я могу получить доступ вне запроса на выборку?

Вот мой код:

#HTML 

<script src = "script.js"></script>

<table>
  <thead>
    <tr>
      <th>City</th>
      <th>County</th>
      <th>Percent Immunized</th>
    </tr>
  </thead>
  <tbody id = "vaxData">

#JS

$.ajax({
    url: "https://health.data.ny.gov/resource/nvtm-yit2.json",
    type: "GET",
    data: {
      "$limit" : 5000,
      "$$app_token" : "aGFbKDOg0gCeCm2c9Od2EsFjL"
    }
}).done(function(data) {
  alert("Retrieved " + data.length + " records from the dataset!");
  console.info(data);
  
  return data
});

var vaxData = document.getElementById(data);

JSFiddle - https://jsfiddle.net/jconoranderson/bgk3Lvx5/25/

Привет Джон, пожалуйста, проверьте это: stackoverflow.com/questions/52399080/…

Rajat Jha 14.04.2023 18:08

в «сделано (обратный вызов)» вы получаете данные, но нигде их не сохраняете. Либо вы обрабатываете свои данные, а затем представляете их в представлении (как показал вам @rajatJha), либо сохраняете их в переменной за пределами области обратного вызова, чтобы к ним можно было получить доступ позже. Кроме того, getElementById принимает строку, а не набор данных.

strongmmc 14.04.2023 18:11

Вот мне и интересно, как хранить.

John Conor 14.04.2023 18:13

сохранить любую базу данных

Rajat Jha 14.04.2023 18:15

Проблема, с которой я столкнулся в этом примере, заключается в том, что он использует недавно объявленную переменную для создания «данных». Я пытаюсь понять, как взять данные, возвращаемые командой fetch, и поместить их в переменную, которую можно использовать в другом месте сценария.

John Conor 14.04.2023 19:51

Как еще вы хотели бы использовать данные, кроме обновления таблицы?

Ben Stephens 14.04.2023 20:58

Спасибо, Бен, у меня действительно возникли проблемы с созданием переменной за пределами первоначального подключения к API, которую я могу использовать для доступа к данным. Если вы посмотрите на скрипт, вы увидите, что я пытался создать функцию для хранения данных в виде переменной, но я все еще получаю сообщение об ошибке function is not defined.

John Conor 14.04.2023 21:01

Что я пытаюсь сделать, так это взять return data и поместить это в переменную, которую я могу использовать в другом месте. После этого я могу начать смотреть на html и т.д.

John Conor 14.04.2023 21:02

Но нужно ли вам «хранить» данные или вы можете просто использовать их для обновления таблицы, а затем забыть об этом?

Ben Stephens 14.04.2023 21:03

В конечном итоге я хочу использовать его для создания визуализаций, поэтому, как только данные будут сохранены в объекте, который я смогу использовать в другом месте, у меня будет гораздо больше возможностей. Новая рабочий пример - jsfiddle.net/jconoranderson/bgk3Lvx5/45

John Conor 14.04.2023 21:04

Помогает ли ответ, который я дал ниже, вообще?

Ben Stephens 14.04.2023 21:25

Давайте продолжим обсуждение в чате.

John Conor 14.04.2023 21:26
Поведение ключевого слова "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
12
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Конкретная ошибка, которую вы получаете, относится к этой строке:

var vaxData = document.getElementById(data);

Так как здесь нет переменной данных в области видимости.

Вы можете подумать, что возврат значения из обратного вызова done заполнит эту переменную, но этого не произойдет, потому что она находится в другой области (что вы можете исправить, объявив данные var перед вызовом $.ajax), и это происходит в другое время и контекст. Выполнение javascript не будет ждать завершения обратного вызова done, и var vaxData = document.getElementById(data); запустится до того, как запустится alert("Retrieved " + data.length + " records from the dataset!");. Лучшее объяснение такого рода вещей можно найти на MDN.

Кроме того, document.getElementById() ожидает строку, а не массив, как должны быть данные, возвращаемые из API.

Чтобы решить эту проблему, вы можете объявить переменную data перед вызовом $.ajax и выполнить обновление таблицы в функции обратного вызова done. В приведенном ниже примере я использовал функцию с именем update_table, чтобы сделать это, и я вызвал datavaccination_data.

Еще одна проблема заключается в том, что в вашем примере HTML для таблицы не завершен.

var vaccination_data = [];

$.ajax({
  url: "https://health.data.ny.gov/resource/nvtm-yit2.json",
  type: "GET",
  data: {
    "$limit" : 5000,
    "$$app_token" : 'your_app_token'
  }
}).done(function(api_data) {
  vaccination_data = api_data;
  update_table();
});

var vaxData = document.getElementById('vaxData');

const cell_keys = ['city', 'county', 'percentcompletelyimmunized'];

function create_element(tag, attributes, children = []) {
  const element = Object.assign(document.createElement(tag), attributes);
  element.append(...children);
  return element;
}

function create_row_element(item) {
  return create_element(
    'tr', {},
    cell_keys.map( (key) => create_element('td', { innerHTML: item[key] }) )
  );
}

function update_table() {
  vaxData.innerHTML = '';
  vaxData.append(...vaccination_data.map(create_row_element));
}

<table>
  <thead>
    <tr>
      <th>City</th>
      <th>County</th>
      <th>Percent Immunized</th>
    </tr>
  </thead>
  <tbody id = "vaxData"></tbody>
</table>

Отредактируйте, чтобы добавить эту строку: vaccination_data = api_data; также использует что-то, называемое замыканием, чтобы функция обратного вызова done имела ссылку на переменную vaccination_data.

Это очень полезно, спасибо! Я ценю ваш подробный ответ. Хотя, когда я пытаюсь запустить это в jsfiddle, я получаю сообщение об ошибке: "<a class='gotoLine' href='#52:1'>52:1</a> Uncaught ReferenceError: $ is not defined". Я пытаюсь отлаживать, прежде чем, наконец, соглашусь, я все еще учусь различать ошибки .js. Я привык к python, где он определяет точную строку...

John Conor 14.04.2023 21:29

Включаете ли вы jQuery в новую скрипку?

Ben Stephens 14.04.2023 21:30

Ах, неважно! Я запускал его на чистом javascript. Большое спасибо за вашу помощь и терпение. Я очень новичок в javascript.

John Conor 14.04.2023 21:31

Еще один вопрос @Бен Стивенс. Если бы я хотел получить доступ к данным в таблице как к объекту. Как бы я это сделал? Например, функция vaxData возвращает a. не больше информации, чем просто объект json, содержащий данные...

John Conor 14.04.2023 22:49

@JohnConor Я не думаю, что понимаю вопрос. vaxData — это переменная, содержащая ссылку на объект HTMLElement. По «Если бы я хотел получить доступ к данным в таблице как к объекту». вы имеете в виду данные, которые вы получили из API, или содержимое ячеек таблицы (или что-то еще)?

Ben Stephens 14.04.2023 22:57

Извините, я подхожу к этому в своей питоновой шляпе. То, что я пытаюсь достичь помимо таблицы, - это var, который является объектом, содержащим json данные. Что-то, к элементам которого я могу получить доступ и использовать данные для создания визуализаций и т. д. Что-то похожее на фрейм данных pandas.

John Conor 14.04.2023 23:06

@JohnConor vaccination_data содержит данные из API, они используются в приведенном выше коде в функции update_table для создания строк и ячеек таблицы, но это может использовать любая функция с доступом к переменной vaccination_data.

Ben Stephens 14.04.2023 23:13

Понял, спасибо! Вы были невероятно полезны. Спасибо за ваше время.

John Conor 14.04.2023 23:17

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