Java Script для интернет-теста скорости HTML и JS, неправильная структура

Я пытаюсь заставить этот скрипт работать, но когда я нажимаю кнопку проверки, он ничего не делает, со скриптом что-то не так, возможно, в цикле while. Идея состоит в том, чтобы загрузить одно и то же изображение 10 раз и усреднить полученную скорость загрузки.

document.querySelector('button').addEventListener('click', (e) => {
    var imageLink = 'https://upload.wikimedia.org/wikipedia/commons/3/3e/Tokyo_Sky_Tree_2012.JPG',
    downloadSize = 8185374,
    time_start, time_end,
    downloadSrc = new Image();
    document.querySelector('.loader-content').classList.add('hide');
    document.querySelector('.loader').classList.remove('hide');
    
    var j= 0;
    var FInalSpeed;
    
    while (j<10) {
      time_start = new Date().getTime();
      console.info(time_start
      var cacheImg = "?nn = " + time_start;
      downloadSrc.src = imageLink + cacheImg;
      console.info(downloadSrc);
      downloadSrc.onload = function() {
        //this function will trigger once the image loads
        time_end = new Date().getTime();
        var timeDuration = (time_end - time_start) / 1000;
        loadedBytes = downloadSize * 8,
        totalSpeed = ((loadedBytes / timeDuration) / 1024 / 1024).toFixed(2);
        FinalSpeed= FinalSpeed + totalSpeed;
    
        let i=0, speedOut;
        const animate = () => {
          if ( i < FinalSpeed ) {
            document.querySelector('.content').innerHTML = i.toFixed(2) + '<small>Mbps</small>';
            setTimeout(animate, 20);
            i+=1.02;
          } else {
            document.querySelector('.content').innerHTML = FinalSpeed + '<small>Mbps</small>';
          }
        }
        animate();

        document.querySelector('.content').innerHTML = FinalSpeed + '<small>Mbps</small>';
        document.querySelector('.loader-content').classList.remove('hide');
        document.querySelector('.loader-content').classList.add('result');
        document.querySelector('.loader').classList.add('hide');
        document.querySelector('.content').classList.remove('hide');
        e.target.innerText = 'CHECK AGAIN';
    }
})

Я попробовал изменить цикл, объявив переменные, а не объявив переменные. Но я не могу понять, откуда возникла проблема, похоже, это проблема базовой структуры.

Нет языка с названием java script, есть java или javascript. не существует гипотетического «скриптового» языка, основанного на языке Java

Mister Jojo 07.04.2024 14:33

Скрипт никогда не меняет значение j, поэтому это бесконечный цикл.

Guy Incognito 07.04.2024 14:37

ваши брекеты не подходят друг другу

Mister Jojo 07.04.2024 14:46

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

tacoshy 07.04.2024 14:55

«Я пробовал изменить цикл, объявить переменные, а не объявить переменные. Но я не могу понять, откуда возникла проблема, похоже, это проблема базовой структуры» ... Вы говорите об этом так, как будто это не ваше дело. код. Откуда вы это взяли? Помимо многочисленных проблем, упомянутых в комментариях выше, очевидно ваше непонимание того, что событие onload делает для единственного экземпляра изображения в вашем (бесконечном) цикле.

GetSet 07.04.2024 15:02

Кстати, ваш код кажется немного беспорядочным, может быть, вы могли бы использовать какой-нибудь линтер (например, eslint) или средство для улучшения кода (например, prettier)? Это значительно упрощает отслеживание ошибок в коде и повышает удобство разработки. Один небольшой пример: вы определяете переменную FInalSpeed (прописная i), но затем используете переменную с именем FinalSpeed (строчная i) позже в коде. Это не совсем проблема в Javascript, но все равно усложняет внешний вид вашего кода.

Rico 07.04.2024 16:00

@Rico Хороший улов несоответствия имен переменных (FInalSpeed), но это определенно проблема, поскольку javascript чувствителен к регистру идентификаторов.

GetSet 08.04.2024 02:16

Конечно, вы правы @GetSet .. чтобы лучше объяснить мой комментарий: явное определение переменной в Javascript не является обязательным (вы можете просто использовать ее без определения), и следующий код все равно должен работать без установки переменной. Однако в этой ситуации это действительно вызывает часть проблемы, поскольку переменная не определена глобально, а только локально для обработчика загрузки.

Rico 08.04.2024 10:25

Использование JS-скрипта — лучший способ протестировать подключение к Интернету для пользователей. Если вы говорите о тестировании скорости синхронизации, поступающей в ваш дом, поскольку когда-то они стремились обеспечить одинаковую скорость для всех устройств, вот и сделано. через маршрутизатор или с помощью кабеля на задней панели маршрутизатора, отключив все остальные устройства, в большинстве случаев люди говорят, что моя скорость не такая, как говорит интернет-провайдер, но это так, просто неизвестно, это скорость, поступающая на маршрутизатор, а не Wi-Fi.

CFCBazar 08.04.2024 19:38
Поведение ключевого слова "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) для оценки ваших знаний,...
4
9
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

здесь многое идет не так, я скажу тебе, что я рекомендую делать,

  • в этом случае вам следует использовать async, чтобы использовать ожидание внутри
  • установите для FinalSpeed ​​значение 0, сильный текст (на всякий случай, если неопределенные действия...)
  • измените while на for и снова используйте async/await.
  • добавьте обещание дождаться этого изображения :)
  • лучшее отслеживание скорости загрузки
  • и обработка ошибок (очень важно) ;)
  • также я усредняю ​​скорость загрузки

код должен выглядеть так:

// Changed to an async function to use await inside
document.querySelector('button').addEventListener('click', async (e) => {
    const imageLink = 'https://upload.wikimedia.org/wikipedia/commons/3/3e/Tokyo_Sky_Tree_2012.JPG';
    const downloadSize = 8185374;
    let FinalSpeed = 0; // Initialized FinalSpeed to 0 to fix undefined addition issue

    document.querySelector('.loader-content').classList.add('hide');
    document.querySelector('.loader').classList.remove('hide');

    // Changed while loop to for loop to use async/await for sequential downloads
    for (let j = 0; j < 10; j++) {
        const time_start = new Date().getTime();
        const cacheImg = "?nn = " + time_start;
        const downloadSrc = new Image();

        // Wrapped the onload event in a promise to await image loading
        await new Promise((resolve, reject) => {
            downloadSrc.onload = function() {
                const time_end = new Date().getTime();
                const timeDuration = (time_end - time_start) / 1000;
                const loadedBytes = downloadSize * 8;
                const totalSpeed = (loadedBytes / timeDuration) / 1024 / 1024;
                FinalSpeed += totalSpeed; // Accumulates speed for each download
                resolve(); // Resolve the promise once the image has loaded
            };
            downloadSrc.onerror = reject; // Handle image load errors
            downloadSrc.src = imageLink + cacheImg;
        });
        }
    
        FinalSpeed = (FinalSpeed / 10).toFixed(2); // Averages the speed after all downloads

        document.querySelector('.content').innerHTML = FinalSpeed + '<small>Mbps</small>';
        document.querySelector('.loader-content').classList.remove('hide');
        document.querySelector('.loader-content').classList.add('result');
        document.querySelector('.loader').classList.add('hide');
        document.querySelector('.content').classList.remove('hide');
        e.target.innerText = 'CHECK AGAIN'; // Ready for a new check
    });

Проверьте его и сообщите мне, исправили ли он ваши ошибки.

также в JavaScript нет пробелов в имени: p

Отлично сделано (при условии, что оно работает). Не могли бы вы превратить это в работоспособный фрагмент?

GetSet 07.04.2024 15:33

Спасибо! Я новичок в JS, прошу прощения за неправильный процесс. Моя идея заключалась в том, чтобы сделать хороший HTML-спидтест, я взял готовый пример и переработал его, но возникли некоторые проблемы. После тестирования я обнаружил, что лучше всего установить значение цикла на 5 вместо 8 для более слабых соединений, но, возможно, лучше установить его выше для лучших соединений. Я думаю, что измерение будет неточным для более высоких скоростей. Вы можете использовать это, чтобы проверить, если хотите cc.free.bg

CFCBazar 07.04.2024 20:01

Я добавил небольшой тест для медленных соединений: if (FinalSpeed/j < 5 && j==5) j = 0;

CFCBazar 08.04.2024 19:57

@GetSet, может быть, да, я, конечно, посмотрю на это

RobyRew 09.04.2024 10:34

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

Похожие вопросы