Логотип YeaHub

Загрузка страницы книги (Book Page Loader)

3

JavaScript

Асинхронность

Сбер

Условие: Реализуйте функцию loadBookPage(bookId, services), которая возвращает Promise с данными для страницы книги. Объект services содержит четыре асинхронные функции (каждая возвращает Promise):

  • getBook(bookId) → { title, description, authorId, publisherId }

  • getAuthor(authorId) → { name }

  • getPublisher(publisherId) → { name }

  • getAuthorBookIds(authorId) → массив ID книг автора

  • getBookTitles(ids) → массив названий по массиву ID

Результат функции: { title, description, author, publisher, authorBooks }, где author и publisher это имена, а authorBooks это массив названий книг автора.

Чтобы не заставлять пользователя ждать лишнего, запросы должны идти так:

  1. Сначала getBook.

  2. Затем параллельно getAuthor, getPublisher и getAuthorBookIds, потому что им нужен только authorId или publisherId.

  3. Затем getBookTitles с полученными ID. Его нельзя вызывать раньше времени.

Если любой сервис отклоняет Promise, итоговый Promise отклоняется с той же ошибкой.

Ограничения:

  • Каждый сервис вызывается не более одного раза.

  • Таймеры не использовать.

  • Допустимы и .then()-цепочки, и async/await.

Примеры:

  • loadBookPage(1, services) → { title: "Dune", description: "Sci-fi novel", author: "Frank Herbert", publisher: "Chilton", authorBooks: ["Dune", "Dune Messiah"] }

  • Если getAuthor отклонён с ошибкой "author not found", то результат Promise отклонён с этой ошибкой.

Loading...