#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, который я храню в переменной под названием «логотип». Когда я получаю данные из второго запроса на выборку и пытаюсь добавить эти данные (данные-это просто логотип для конкретной криптовалюты ) к каждому из разделов с логотипом, все данные сохраняются только в одном из разделов с логотипом.