Giter Site home page Giter Site logo

testex's Introduction

Тестовое задание

Класс реализующий запрос на стороннее API, возвращающее результат в формате

{
  total: 110,
  userCount: 20,
  page: 1,
  users: [
    { name: "Joe Doe", rank: 15 },
    { name: "Peter Parker", rank: 39 },
    ...
  ]
}

#Получение данных с API Самый очевидный вариант решения проблемы посылать последовательно запросы до тех пор, пока мы не получим всех данных. Проблема в том, что такой вариант займет длительное время, в случае если количество данных велико.

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

Делать запрос на данные я буду следующим образом:

  1. Запрашиваю 1 страницу. Получаю данные по пользователям, получаю информацию о общем количестве записей и о количестве записей в одной странице.
  2. Рассчитываю сколько запросов дополнительно мне нужно сделать
  3. Формирую запросы добавляю их в массив запросов. Жду их завершения.
  4. Формирую и возвращаю результат.

#Структура классов

##Действия совершаемые в контексте задачи

  1. Совершать сетевые запросы
  2. Парсить данные ответов
  3. Осуществлять выборку ответов по критерию

##Возможные изменения

  1. Может поменяться структура ответа с API сервера.
  2. Критерий выборки ответов
  3. Механизм совершения запросов

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

Также существует вероятность появления на API сервере ограничения на количество запросов в единицу времени. В данный ситуации придется ждать какое-то интервал вермени между запросами, а сами запросы группировать в количестве, допускаемом сервером. Сделать это можно будет путем добавления в очередь групп запросов с ожиданием их резолва. Возможно также использовать setTimeout для длительного ожидание(если это будет нужно). Резолвить асинхронно такие группы запросов я бы стал при поиощи цикла for ... in - он умеет корректно отрабатывать резолв промиса.

Если, к примеру, запросов будет много и станет актуальным вопрос отмены очереди запросов - тогда я бы реализовал метод с ипользованием генераторов. В next генератора можно будет передавать флаг продолжения цикла, а возвращать каждый цикл он может отфильтрованные данные.

testex's People

Contributors

tereonn avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.