Javascript .then()在嵌套的promise.all和fetch完成之前执行

Javascript .then()在嵌套的promise.all和fetch完成之前执行,javascript,json,api,es6-promise,fetch-api,Javascript,Json,Api,Es6 Promise,Fetch Api,我正在尝试创建一个应用程序,使用Javascript中的fetch从API检索数据。下面是几个URL的JSON结构 myapi.com/list返回: [{id:111,用户:nam1},{id:222,用户:nam2}] 然后我必须用其中一个id做另一个请求 示例:myapi.com/list/111返回: [{id:111,user:name1,description: "some text",public:true}] 示例:myapi.com/list/111/posts返回: [{a

我正在尝试创建一个应用程序,使用Javascript中的fetch从API检索数据。下面是几个URL的JSON结构

myapi.com/list返回: [{id:111,用户:nam1},{id:222,用户:nam2}] 然后我必须用其中一个id做另一个请求 示例:myapi.com/list/111返回:

[{id:111,user:name1,description: "some text",public:true}]
示例:myapi.com/list/111/posts返回:

[{a1:"some data",a2:"some data2"},{b1:"some data",b2:"some data2"},{c1:"some data",c2:"some data2"}]
出于几个原因,我需要创建一个函数,该函数返回1个数组,并以以下格式对所有这些数组进行分组:

   [
    {id:111,user:name1,description: "some text",public:true, 
    posts:[{a1:"some data",a2:"some data2"},{b1:"some data",b2:"some data2"},{c1:"some data",c2:"some data2"}]
    },
    {id:222,user:name2,description: "some text2",public:true
    posts:[{a1:"some data",a2:"some data2"},{b1:"some data",b2:"some data2"},{c1:"some data",c2:"some data2"}
    }
    ]
这是我的主要节目 由于设置超时,此操作正常:

    Promise.all([FetchFunctionThatworks(),FetchfunctionWithPrblm() ])
    .then(values => new State(values[0], values[1]))
    .then(state => {console.log(state) ; 

      setTimeout(function(){
      functionA(state); // a function that prints some html with the result of the FetchfunctionWithPrblm

  },200)
   ;} )
    .catch(reason => console.error(reason));
我希望删除setTimeout,但问题是.then()中的代码在承诺得到解决之前调用function,因此我得到的结构缺少“posts”,随着setTimeout,我得到了所需的输出

以下是my FetchFunction with prblm()

不是承诺吗?所有人都应该在承诺解决后才回来? 有人能告诉我我做错了什么吗?帮我修一下

提前感谢

您的问题在这里:

ListNopost.map( single_entry =>{
   Promise.all( [fetch( url + single_entry.id+ '/posts').then(resp=>resp.json() ) ] )
   .then (posts_data =>{
     single_entry.posts=posts_data[0];
   })
})
return ListNopost;
Promise.all
永远不会返回,因此在
fetch
s返回之前,您的主要承诺已解决。还要注意的是,
map
不是一个mutator,如果希望它包含在新数组中,则必须返回一个值

试试这个:

var promises = ListNopost.map(single_entry => {
    return fetch(url + single_entry.id + '/posts')
        .then(resp => resp.json())
        .then(posts_data => {
            single_entry.posts = posts_data[0]
            return single_entry
        })
})
return Promise.all(promises)

非常感谢你帮助我。你无法想象我有多感激。我一直在尝试你建议的每一个编辑。您的最终编辑工作完美。我只需要“posts”作为完整数组,而不仅仅是第一个对象,所以我删除了[0]。非常感谢你,再次感谢!!
var promises = ListNopost.map(single_entry => {
    return fetch(url + single_entry.id + '/posts')
        .then(resp => resp.json())
        .then(posts_data => {
            single_entry.posts = posts_data[0]
            return single_entry
        })
})
return Promise.all(promises)