Загрузка страницы книги (Book Page Loader)
3
Асинхронность
Условие: Реализуйте функцию 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 это массив названий книг автора.
Чтобы не заставлять пользователя ждать лишнего, запросы должны идти так:
Сначала
getBook.Затем параллельно
getAuthor,getPublisherиgetAuthorBookIds, потому что им нужен толькоauthorIdилиpublisherId.Затем
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 отклонён с этой ошибкой.