Как использовать метод fetch() для выполнения нескольких вызовов API с помощью vanilla JavaScript
Иногда вам нужно вызвать API, а затем использовать данные, которые вы получаете от этого API, для вызова другого метода по цепочке.
Пример
Например, предположим, что вы хотите получить конкретную запись с использованием /posts
конечной точки.
fetch('https://jsonplaceholder.typicode.com/posts/5');
API возвращает идентификатор автора сообщения, но без дополнительной информации.
var data = {
userId: 1,
id: 5,
title: "nesciunt quas odio",
body: "repudiandae veniam quaerat sunt sed alias aut fugiat sit autem sed est voluptatem omnis possimus esse voluptatibus quis est aut tenetur dolor neque"
};
Если вы хотите взять эти данные и отобразить сообщение в пользовательском интерфейсе с информацией об авторе, вам необходимо вызвать другой API метод /users
- и передать ему userId
в качестве параметра.
fetch('https://jsonplaceholder.typicode.com/users/' + data.userId);
Вложенные методы fetch()
Поскольку метод fetch()
возвращает Promise, вы можете выполнить return
в методе then()
, и следующий метод then()
в цепочке будет запущен после его разрешения.
Используя наш пример выше, мы сначала вызовем наш /posts
. Затем мы сохраним возвращенный ответ в переменной с именем post
.
Далее мы сделаем return
и вернем новый вызов fetch()
к /users
, используя свойство data.userId
как часть вызова API метода. как только он разрешается, у нас есть обе части данных, которые нам нужны для визуализации нашего пользовательского интерфейса.
На данный момент, давайте просто выведем post
и userData
объекты в консоль.
var post;
fetch('https://jsonplaceholder.typicode.com/posts/5').then(function (response) {
if (response.ok) {
return response.json();
} else {
return Promise.reject(response);
}
}).then(function (data) {
post = data;
return fetch('https://jsonplaceholder.typicode.com/users/' + data.userId);
}).then(function (response) {
if (response.ok) {
return response.json();
} else {
return Promise.reject(response);
}
}).then(function (userData) {
console.log(post, userData);
}).catch(function (error) {
console.warn(error);
});
Если вы хотите вызывать несколько вызовов API одновременно, лучше использовать метод Promise.all()
как на примере ниже:
Promise.all([
fetch('https://jsonplaceholder.typicode.com/posts'),
fetch('https://jsonplaceholder.typicode.com/users')
]);