123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- // speedtest
- // Написать асинхронную функцию, где:
- // count - количество повторов
- // parallel - количество одновременных запросов / промисов в одном повторе
- // getPromise - функция, которая умеет вернуть нужный Вам промис для тестирования скорости его работы
- // которая будет в цикле count раз создавать parallel промисов с помощью переданной функции getPromise, дожидаться выполнения всех parallel промисов, после чего цикл повторяется.
- // Замерить время общее время выполнения, и вычислить:
- // duration, общую длительность работы цикла
- // parallelDuration, среднее время обработки запроса параллельно(за какое время исполнилось parallel * count промисов),
- // paralledSpeed, скорость в запросах в миллисекунду
- // queryDuration, реальное среднее время запроса(отталкиваясь от count и времени работы цикла).
- // querySpeed, реальное средняя скорость запроса
- // Эти переменные вернуть в одном объекте - результате(см.заготовку выше)
- // Для отладки попробуйте на delay(пример выше есть, реальное время будет отличаться на единицы - десятки миллисекунд).Потом можете попробовать на swapi.dev.Не создавайте чрезмерно много параллельных запросов.
- {
- async function speedtest(getPromise, count, parallel = 1) {
- const start = performance.now()
- let promiseArr = []
- for (let i = 0; i < count; i++) {
- for (let j = 0; j < parallel; j++) {
- promiseArr.push(getPromise())
- }
- await Promise.all(promiseArr)
- }
- const end = performance.now()
- const duration = +(end - start).toFixed(5)
- const querySpeed = +(count / duration).toFixed(5)
- const queryDuration = +(duration / count).toFixed(5)
- const paralledSpeed = +((count * parallel) / duration).toFixed(5)
- const parallelDuration = +(duration / (count * parallel)).toFixed(5)
- return {
- duration,
- querySpeed,
- queryDuration,
- paralledSpeed,
- parallelDuration
- }
- }
- const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms))
- // Проверка
- speedtest(() => delay(1000), 10, 10).then(result => console.log('delay: ', result))
- // {duration: 10000,
- // querySpeed: 0.001, //1 тысячная запроса за миллисекунду
- // queryDuration: 1000, //1000 миллисекунд на один реальный запрос в среднем
- // parallelSpeed: 0.01 // 100 запросов за 10000 миллисекунд
- // parallelDuration: 100 // 100 запросов за 10000 миллисекунд
- speedtest(() => fetch('http://swapi.dev/api/people/1').then(res => res.json()), 10, 5).then(result => console.log('swapi: ', result))
- }
- // gql
- // Напишите функцию gql, которая осуществляет GraphQL запрос. Функция принимает три параметра:
- // 1. Эндпоинт - адрес сервера.Например "http://shop-roles.node.ed.asmer.org.ua/graphql"
- // 2. Текст запроса(query).Например:
- // query cats($q: String){
- // CategoryFind(query: $q){
- // _id name
- // }
- // }
- // 3. Параметры(переменные)(variables) запроса объектом.Например:
- // {
- // q: "[{}]"
- // }
- // Функция должна возвращать промис, созданный fetch со следующими настройками:
- // Метод POST
- // Заголовки:
- // Content - Type - application / json
- // Accept - application / json
- // Тело - JSON, объект с двумя ключами - query(текст запроса) и variables
- {
- const gql = function (url, query, variables) {
- let gqlParams = {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- Accept: 'application/json'
- },
- body: JSON.stringify(
- {
- query,
- variables
- }
- )
- }
- return fetch(url, gqlParams).then(res => res.json())
- };
- // проверка
- (async () => {
- const catQuery = `query cats($q: String){
- CategoryFind(query: $q){
- _id name
- }
- }`
- const cats = await gql("http://shop-roles.node.ed.asmer.org.ua/graphql", catQuery, { q: "[{}]" })
- console.log(1, cats) //список категорий с _id name и всем таким прочим
- const loginQuery = `query login($login:String, $password:String){
- login(login:$login, password:$password)
- }`
- const token = await gql("http://shop-roles.node.ed.asmer.org.ua/graphql", loginQuery, { login: "test457", password: "123123" })
- console.log(2, token)
- })()
- }
- // jwtDecode
- // Напишете функцию jwtDecode, которая принимает единственный параметр token и возвращает информацию из переданного JWT токена.
- // Алгоритм раскодирования:
- // Разбить токен на три части.Разделитель - . (точка)
- // Выделить среднюю часть.
- // Используя функцию atob раскодировать среднюю часть из кодировки Base64, получив JSON
- // Раскодировать JSON
- // Вернуть раскодированные данные из JSON
- // Учтите, что в качестве токена может быть передана какая - то дичь.В таком случае раскодировка не получится, и функция:
- // Не должна сыпать красными матюками(ошибками) в консоль
- // Должна просто вернуть undefined
- {
- const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOnsiaWQiOiI2MzIyMDVhZWI3NGUxZjVmMmVjMWEzMjAiLCJsb2dpbiI6InRlc3Q0NTciLCJhY2wiOlsiNjMyMjA1YWViNzRlMWY1ZjJlYzFhMzIwIiwidXNlciJdfSwiaWF0IjoxNjY4MjcyMTYzfQ.rxV1ki9G6LjT2IPWcqkMeTi_1K9sb3Si8vLB6UDAGdw"
- const jwtDecode = function (token) {
- try {
- let parseData = token.split('.')[1]
- return JSON.parse(atob(parseData))
- }
- catch (e) {
- return undefined
- }
- }
- console.log(jwtDecode(token))
- //{
- // "sub": {
- // "id": "632205aeb74e1f5f2ec1a320",
- // "login": "test457",
- // "acl": [
- // "632205aeb74e1f5f2ec1a320",
- // "user"
- // ]
- // },
- // "iat": 1668272163
- //}
- try {
- console.log(jwtDecode()) //undefined
- console.log(jwtDecode("дичь")) //undefined
- console.log(jwtDecode("ey.ey.ey")) //undefined
- console.log('до сюда доработало, а значит jwtDecode не матерился в консоль красным цветом')
- }
- finally {
- console.log('ДЗ, видимо, окончено')
- }
- }
|