Используйте Array.prototype.map
, чтобы превратить массив value
в массив Promises, и вызовите .then
для Promise.all
этого массива. Вам также следует избегать антипаттерна Promise-as-callback, просто return
Promise от одного .then
, чтобы связать его с другим .then
, не создавая ненужных вложений:
function myFunction () {
fetch("https://jsonplaceholder.typicode.com/albums")
.then(first_response => first_response.json())
.then(arr => Promise.all(arr.map(item =>
fetch("https://jsonplaceholder.typicode.com/users")
.then(second_response => second_response.json())
.then(value => console.log(value))
)))
.then(() => {
console.log("DONE!!");
});
}
myFunction();
Обратите внимание, текущий код, по-видимому, не использует ничего в первом ответе, кроме длины результирующего массива, что довольно странно - если вы хотите использовать элемент, который вы перебираете (например, для создания нового URL-адреса для извлечения) используйте переменную item
в приведенной выше функции отображения.
Вам нужно собрать обещания в массив и использовать Promise.all()
для обеспечения обратного вызова, когда все будет выполнено. Самый простой способ сделать это - изменить цикл for
на вызов Array.prototype.map()
:
function myFunction() {
fetch("https://jsonplaceholder.typicode.com/albums").then(first_response => {
return first_response.json();
}).then(function(value) {
const promises = value.map((_, i) => {
return fetch("https://jsonplaceholder.typicode.com/users")
.then(second_response => second_response.json())
.then(value => console.log(value))
});
return Promise.all(promises);
}).then(() => console.log("DONE!!"));
}
myFunction();
.as-console-wrapper { max-height: 100% !important; top: 0; }
Вы можете использовать функцию обещаний функции es6, чтобы собрать все ваши запросы на выборку, и если все обещания выполнены, вы можете напечатать готово.
function myFunction () {
var promises = [];
var promise = undefined;
fetch("https://jsonplaceholder.typicode.com/albums").then(first_response => {
first_response.json().then(function(value) {
for (var i = 0; i < value.length; i++){
promise = fetch("https://jsonplaceholder.typicode.com/users/?id="+value[i].id)
.then(second_response => second_response.json())
.then(value => console.log(value))
promises.push(promise)
}
Promise.all(promises).then(function(){ console.log("Done!");});
});
});
}