Вызов двух запросов на выборку в Django с помощью Javascript отображает результат в одном и том же div

#javascript #django #fetch

Вопрос:

Я действительно новичок в Javascript, поэтому будьте добры! Должно быть, что-то не так с тем, как я это структурирую. Я видел возможные решения, которые могли бы включать асинхронные функции, и я пробовал их, но по какой-то причине я могу неправильно понять порядок или просто упускаю суть.

Я использую запрос на извлечение для получения некоторых данных сначала из API, который я создал на своем локальном сервере. И это прекрасно работает. Я могу получить названия криптовалют, которые я связал с именем пользователя в формате JSON.

После того, как я создал стиль для отображения divs и вставил данные, я вызываю другую выборку для другого API, на этот раз внешнего, для дальнейшего получения данных и вставки их в divs, которые я создал ранее, для каждого фрагмента данных, полученных из моего собственного API.

По какой-то причине это приводит к отображению данных, которые я получаю из этого внешнего API, в одном и том же div, вместо того, чтобы отображать их для каждого. Я пробовал функцию forEach, я пробовал (i=0;ядлина;i ), я пытался разместить его по-другому, я пытался создавать глобальные переменные и использовать их, но, похоже, ничего не работает, и вопросы, которые я ищу, не совсем выполняют свою работу.

Данные, которые я получаю, являются ЛОГОТИПОМ КРИПТОВАЛЮТЫ. ОБА ЛОГОТИПА, которые я называю, помещаются в первый созданный div с идентификатором = cryptologo, а не в каждый div с идентификатором = cryptologo, соответствующий конкретному логотипу.

Я был бы рад некоторой помощи. Спасибо.

Это мой код:

 document.addEventListener('DOMContentLoaded', function() {


fetch('/allfollowedcryptos')
  .then(response => response.json())
  .then(data => {

  // Print result
  console.log(data);
  
  for (i in data){

  var container = document.getElementById('maincont');    

  var savedcrypto = document.createElement('div');
  savedcrypto.style.height = '200px';
  savedcrypto.style.width = '1200px';
  savedcrypto.style.marginTop = '20px';

  var nameandlogo = document.createElement('div');
  nameandlogo.style.height = '200px';
  nameandlogo.style.width = '250px';
  nameandlogo.style.backgroundColor = 'red';
  nameandlogo.style.display = 'inline-block';

  var name = document.createElement('div');
  name.style.height = '60px';
  name.style.width = '250px';
  name.style.backgroundColor = 'pink';
  name.style.overflow = "hidden";
  var nm = document.createElement('h1');
  nm.innerHTML = data[i].crypto;
  

  logo = document.createElement('div');
  logo.style.height = '140px';
  logo.style.width = '250px';
  logo.style.backgroundColor = 'purple';
  logo.style.overflow = "hidden";
  logo.setAttribute('id','cryptologo');
  

  var cryptochart = document.createElement('div');
  cryptochart.style.height = '200px';
  cryptochart.style.width = '350px';
  cryptochart.style.backgroundColor = 'white';
  cryptochart.style.display = 'inline-block';
  

  var marketdetails = document.createElement('div');
  marketdetails.style.height = '200px';
  marketdetails.style.width = '600px';
  marketdetails.style.backgroundColor = 'green';
  marketdetails.style.display = 'inline-block';
  marketdetails.style.overflow = "hidden";
  
  name.appendChild(nm);
  nameandlogo.appendChild(name);
  nameandlogo.appendChild(logo);
  savedcrypto.appendChild(nameandlogo);
  savedcrypto.appendChild(cryptochart);
  savedcrypto.appendChild(marketdetails);
  container.appendChild(savedcrypto);

  

  cryptoname = data[i].crypto
  console.log(cryptoname)



     
     let url100 = `https://api.coingecko.com/api/v3/coins/${cryptoname}`;
  
     fetch(url100)
     .then(function(resp) {
     return resp.json();
     })
     .then(function(data){

        console.log(data)
        
        imgcont = document.getElementById('cryptologo');
        var img = document.createElement('img');
        img.style.marginLeft = '70px';
        img.setAttribute('src', `${data.image.small}`) ;
        imgcont.appendChild(img);
     })  

     

  }

  

  });
});
 

это изображение выходного:

введите описание изображения здесь

как вы видите, логотипы находятся только в одном из разделов логотипа, когда я хотел бы, чтобы они были расположены рядом с каждым разделом логотипа.

Ответ №1:

Что-то подобное должно сработать, например, я использовал названия стран и соответствующий флаг, и я использовал async и await .

 const container = document.getElementsByClassName('container')[0];

// ignore this block if you are fetching name from local server
async function getCountryCode() {
    const data = await fetch('https://restcountries.eu/rest/v2/all');
    const countries = await data.json();
    return countries.map((country) => country.alpha3Code);
}

async function fetchCountryDetails() {
    const countryCodes = await getCountryCode(); // if you are fetching name from local server you can do it here ignore above block
    countryCodes.forEach(async (code) => {
        const data = await fetch(`https://restcountries.eu/rest/v2/alpha/${code}`);
        const countryDetails = await data.json();

        const countryContainer = document.createElement('div');
        countryContainer.style.marginBottom = '10px';

        const nameContainer = document.createElement('div');
        nameContainer.style.background = 'green';
        nameContainer.style.margin = 0;

        const imgContainer = document.createElement('div');
        imgContainer.style.background = 'blue';
        imgContainer.style.margin = 0;

        const name = document.createElement('h3');
        name.style.margin = 0;
        const img = document.createElement('img');

        name.innerText = countryDetails.name;
        nameContainer.appendChild(name);
        img.setAttribute('src', countryDetails.flag);
        imgContainer.appendChild(img);
        countryContainer.append(nameContainer, imgContainer);
        container.appendChild(countryContainer);
    });
}

fetchCountryDetails();
 

Комментарии:

1. Спасибо за ваш ответ, но, похоже, это не работает. Даже если я создам новый div, мне все равно нужно будет добавить этот элемент как дочерний к другому существующему элементу, чтобы отобразить его. И когда я это сделаю, оба источника логотипа будут отображаться в этом элементе. В вашем ответе тоже говорится , что вы все еще imgcont.appendChild(img), так что на самом деле ничего не меняется.

2. @mike_thecode, извините, в последней строке должно быть imageContainer.appendchild(img)

3. Тем не менее, этот div не будет отображаться, если он не будет добавлен к чему-либо. Мне бы понадобилось, чтобы он был добавлен в раздел логотипа.

4. @mike_thecode итак, вы хотите, чтобы это изображение было добавлено в div с идентификатором cryptologo?

5. в первой части кода данные, которые я получаю из первой выборки, являются названием некоторых криптовалют, и я создаю для каждой из них несколько div, и один из этих div, которые я создаю для каждой, — это div, который я храню в переменной под названием «логотип». Когда я получаю данные из второго запроса на выборку и пытаюсь добавить эти данные (данные-это просто логотип для конкретной криптовалюты ) к каждому из разделов с логотипом, все данные сохраняются только в одном из разделов с логотипом.