Почему я получаю два набора данных из одного вызова API с помощью Fetch?

Когда я получаю данные API JSON, я получаю двойные результаты. Используя метод .forEach(), я получаю двойные данные, напечатанные в HTML, и мне нужен только один набор.

Вот мой вызов API и цикл

var url = 'https://api.myjson.com/bins/1geede';

fetch(url)
.then(response => response.json())
.then(data =>  {

const scope = data.data.messages;
        console.info(scope);

        //Looping through the user data

        scope.forEach((i) => {

            let user = i;

            if (user.username == "Mygel van Trabel") {

                user1( user.focused, user.message, getTimeStamp(user.timestamp), user.username);

            } else {

                user2( user.focused, user.message, getTimeStamp(user.timestamp), user.username);

            }



        });

}).catch( error => console.error(error));

User1 и User2 — это функции. Вот результаты от console.info(scope):

VM  app.js:20 (4) [{…}, {…}, {…}, {…}]
app.js:20     (4) [{…}, {…}, {…}, {…}]

Прямо сейчас он печатает оба набора в DOM, когда мне нужен только один. Почему это происходит?

На картинке ниже показано, что я пытаюсь сделать.

Почему я получаю два набора данных из одного вызова API с помощью Fetch?

Эта картина - результаты, которые она дает мне сейчас

Почему я получаю два набора данных из одного вызова API с помощью Fetch?

Что такое функции user1 и user2? Без этого отлично работает: jsfiddle.net/bvsLueky

CertainPerformance 10.04.2019 08:23

Я просто добавил их в пост

Michael Stokes 10.04.2019 08:32

Похоже, они ничего не логируют, но без них, как видно из скрипки, данные не дублируются (например, отображаются 4 элемента, а не 8). Можете ли вы показать код, демонстрирующий минимальный воспроизводимый пример?

CertainPerformance 10.04.2019 08:34

@CertainPerformance Как?

Michael Stokes 10.04.2019 08:41

Я не знаю - вы должны создать минимальный воспроизводимый пример, иначе вопрос останется без ответа

CertainPerformance 10.04.2019 08:42

@CertainPerformance Я просто сократил код. Я надеюсь, что соответствует MCVE.

Michael Stokes 10.04.2019 08:43

Проблема по-прежнему не может быть воспроизведена из кода — см. файл JSFiddle. Напечатано 4 элемента, а не 8.

CertainPerformance 10.04.2019 08:44

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

Michael Stokes 10.04.2019 08:44

Не могли бы вы проверить вкладку своей сети, чтобы убедиться, что запрос отправляется только 1 раз, и редактировать вашего сообщения, чтобы включить эту информацию? Это наиболее распространенный случай регистрации дубликатов.

Ferrybig 10.04.2019 17:42

Привет @MichaelStokes, мне любопытно, проверили ли вы вкладку «Сеть», чтобы подтвердить количество запросов, как это было предложено Ferrybig?

Jack 11.04.2019 21:41

@ Джек Да, и я все еще работаю над этим. Я вижу два запроса на выборку. Один из VM, а другой из app.js. Они оба печатаются в HTML.

Michael Stokes 12.04.2019 00:29

Кто бы ни проголосовал за этот вопрос, я явно сделал все возможное, чтобы объяснить проблему и опубликовал соответствующий код.

Michael Stokes 12.04.2019 01:22

@MichaelStokes, попался! Я не отрицал, но вижу, что вы включили дополнительную информацию (так что проголосовали за ваш способ смещения! :)) - Одна вещь, которую вы можете сделать, это добавить оператор debugger перед журналом консоли и пройтись по трассировке стека, чтобы увидеть кто вызывает вызовы выборки - если действительно у вас есть несколько вызовов выборки.

Jack 12.04.2019 02:22
Поведение ключевого слова "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) для оценки ваших знаний,...
2
13
622
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

forEach работает нормально. Если вы проверите console.info своей переменной scope, для которой вы запускаете forEach, вы обнаружите, что область действия содержит дублированные данные, поэтому у нее нет проблем с вашим циклом forEach.

fetch('https://api.myjson.com/bins/1geede')
.then(response => response.json())
.then(function(data) {
    //Declaring the scope variable for user data
    const scope = data.data.messages;

    console.info("Duplication is here: ", scope);
    console.info("---------");

    //Looping through the user data
    scope.forEach((i) => {
        let user = i;

        console.info(user);
    });
});

Его проблема в том, что он видел 8 результатов, а не 4.

CertainPerformance 10.04.2019 08:55

@CertainPerformance Если это так, то почему мы не видим 8 результатов с предоставленным им кодом?

Sami Ahmed Siddiqui 10.04.2019 08:58

Поскольку OP не предоставил минимальный воспроизводимый пример. (Если его проблему невозможно воспроизвести, лучше попросить разъяснений и проголосовать за закрытие)

CertainPerformance 10.04.2019 08:59
Ответ принят как подходящий

Надеюсь, вы не возражаете, но я проверил ваш профиль и заметил файлы в вашем Github. Проблема в src/index.html, где вы определяете <script src = "bundle.js"></script> в строке 35.

Однако когда вы запускаете Webpack, он создает и внедряет одну и ту же строку (как показано на рисунке dist/index.html), что приводит к дублированию вызовов API.

Исправление состоит в том, чтобы просто удалить строку 35 из /src/index.html :) У вас больше не будет двойного JS, вызывающего API.

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