Здесь у меня есть функция, которая принимает массив строк, содержащий имена пользователей учетных записей github. И эта функция собирается возвращать массив пользовательских данных после разрешения. Для каждого пользователя должен быть один запрос на выборку. и запросы не должны ждать друг друга. Так что данные поступают как можно скорее. Если такого пользователя нет, функция должна вернуть null
в полученный массив.
Примером ввода будет ["iliakan", "remy", "no.such.users"]
, а ожидаемое возвращаемое promise
после разрешения даст нам [null, Object, Object]
, Object
- данные, которые содержат информацию о пользователе.
Вот моя попытка решить этот вопрос.
function getUsers(names) {
return new Promise(resolve => {
const array = [];
const url = "https://api.github.com/users/";
const requests = names.map(name => {
const endpoint = `${url}${name}`;
return fetch(endpoint);
});
Promise.all(requests).then(reponses => {
reponses.forEach(response => {
if (response.status === 200) {
response.json().then(data => {
array.push(data);
});
} else {
array.push(null);
}
});
resolve(array);
});
});
}
Он работает, то есть возвращает массив [null, Object, Object]
. И я подумал, что это соответствует требованиям, которые я изложил выше. Однако после тщательного изучения я почувствовал, что не могу в этом полностью разобраться.
Мой вопрос: посмотрите, где мы разрешаем этот массив, он разрешается сразу после forEach
l * 1029. *. Одна вещь, которую я не понимаю, это то, почему она содержит все три элемента, когда некоторые элементы вставляются в нее асинхронно после завершения json()
. Я имею в виду, что в случае response.status === 200
массив отправляется с данными, разрешенными из json()
, и я бы предположил, что эта операция json()
должна занять некоторое время. Поскольку мы не разрешили массив после завершения операции json()
, почему мы все-таки получили все данные, разрешенные с json()
?
Promise.all(requests).then(reponses => {
reponses.forEach(response => {
if (response.status === 200) {
response.json().then(data => {
array.push(data); <--- this should take some time
});
} else {
array.push(null);
}
});
resolve(array); <--- resolve the array immediately after the `forEach` loop
});
});
Мне кажется, что массив, который мы должны получить, должен только один null
в нем, так как на момент его вращения .json()
не должен быть закончен