gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:53:22 40 4
gpt4 key购买 nike

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

myapi.com/list 返回:[{id:111, user:nam1},{id:222, user: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"}
}
]

这是我的主程序由于 setTimeOut:

    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() 中的代码在 promise 解决之前调用了 functionA,所以我得到的结构缺少“posts”,通过 setTimeOut 我得到了所需的输出。

这是我的 FetchfunctionWithPrblm()

function FetchfunctionWithPrblm() {
const url = serverUrl+ "list/";
return fetch(url).then(
id_list => id_list.json()
).then(
list_data => Promise.all(
list_data.map(topic => fetch(url +topic.id)
.then(response => response.json() )
)
) /**end 1st promise.all */

) .then(ListNopost =>{
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 不应该只在 promise 被 resolve 时才返回吗?有人可以告诉我我做错了什么吗?并帮我修复它?

提前致谢

最佳答案

你的问题在这里:

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 永远不会返回,因此您的主要 promise 在 fetch 之前解析。另请注意,map 不是更改器,如果您希望它包含在新数组中,则必须返回一个值。

试试这个:

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)

关于javascript - .then() 在嵌套的 promise.all 和 fetch 完成之前执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56086082/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com