Javascript 在对象数组中循环,为每个对象调用承诺,并在它';完成了

Javascript 在对象数组中循环,为每个对象调用承诺,并在它';完成了,javascript,object,ecmascript-6,promise,es6-promise,Javascript,Object,Ecmascript 6,Promise,Es6 Promise,在这个问题中,我尝试循环遍历从promise中检索到的对象数组,以及数组中我想要的每个对象 要求另一个承诺。一旦我调用了所有这些承诺,我想将其记录到控制台 我怎么知道所有的承诺什么时候都完成了 函数myFunction(){ 取回(“https://jsonplaceholder.typicode.com/albums)然后(第一个响应=>{ 首先是_response.json(),然后是(函数(值){ 对于(变量i=0;isecond\u response.json()) .then(值=>

在这个问题中,我尝试循环遍历从promise中检索到的对象数组,以及数组中我想要的每个对象 要求另一个承诺。一旦我调用了所有这些承诺,我想将其记录到控制台

我怎么知道所有的承诺什么时候都完成了

函数myFunction(){
取回(“https://jsonplaceholder.typicode.com/albums)然后(第一个响应=>{
首先是_response.json(),然后是(函数(值){
对于(变量i=0;isecond\u response.json())
.then(值=>console.log(值))
}
log(“完成!!”);
});
});
}
myFunction()

.as console wrapper{max height:100%!important;top:0;}
使用
Array.prototype.map
数组转换为承诺数组,并调用
。然后在
承诺上调用
。该数组的所有
。您还应该避免将承诺作为回调反模式,只需从一个
返回
承诺。然后
将其链接到下一个
。然后
,而不创建不必要的嵌套:

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),在上面的映射函数中使用
变量。

使用
数组.prototype.map
数组转换为承诺数组,并调用
。然后
调用
承诺。该数组的所有
。您还应该避免将承诺作为回调反模式,只需从一个
返回
承诺。然后
将其链接到下一个
。然后
,而不创建不必要的嵌套:

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),在上面的映射函数中使用
变量。

您需要收集数组中的承诺并使用,以便在所有操作完成后提供回调。最简单的方法是将
for
循环更改为对以下对象的调用:

函数myFunction(){
取回(“https://jsonplaceholder.typicode.com/albums)然后(第一个响应=>{
返回第一个_response.json();
}).然后(函数(值){
const promises=value.map((u,i)=>{
返回取回(“https://jsonplaceholder.typicode.com/users")
.then(second\u response=>second\u response.json())
.then(值=>console.log(值))
});
返回承诺。全部(承诺);
}).然后(()=>console.log(“完成!!”));
}
myFunction()

.as console wrapper{max height:100%!important;top:0;}
您需要收集数组中的承诺并使用,以便在完成所有承诺后提供回调。最简单的方法是将
for
循环更改为对以下对象的调用:

函数myFunction(){
取回(“https://jsonplaceholder.typicode.com/albums)然后(第一个响应=>{
返回第一个_response.json();
}).然后(函数(值){
const promises=value.map((u,i)=>{
返回取回(“https://jsonplaceholder.typicode.com/users")
.then(second\u response=>second\u response.json())
.then(值=>console.log(值))
});
返回承诺。全部(承诺);
}).然后(()=>console.log(“完成!!”));
}
myFunction()

。作为控制台包装器{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!");});
       });
   });
}
函数myFunction(){
var承诺=[];
var承诺=未定义;
取回(“https://jsonplaceholder.typicode.com/albums)然后(第一个响应=>{
首先是_response.json(),然后是(函数(值){
对于(变量i=0;isecond\u response.json())
.then(值=>console.log(值))
承诺。推动(承诺)
}
Promise.all(promises.then(function(){console.log(“Done!”);});
});
});
}

您可以使用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!");});
       });
   });
}
函数myFunction(){
var承诺=[];
var承诺=未定义;
取回(“https://jsonplaceholder.typicode.com/albums)然后(第一个响应=>{
首先是_response.json(),然后是(函数(值){
对于(变量i=0;isecond\u response.json())
.then(值=>console.log(值))
承诺。推动(承诺)
}
Promise.all(promises.then(function(){console.log(“Done!”);});
});
});
}

谢谢,是的。这很奇怪,这是我需要帮助解决的更大问题的一部分。事实上,我将向循环传递值。这些答案对您有帮助吗?如果是这样的话,考虑一下投票和接受其中一个,看看:谢谢,是的。这很奇怪,这是我需要帮助解决的更大问题的一部分。事实上,我将向循环传递值。这些答案对您有帮助吗?如果是这样的话,考虑一下投票并接受其中之一,请看: