- 此问题在此处已有答案**:
When should I use a return statement in ES6 arrow functions(6个答案)
How to return many Promises and wait for them all before doing other stuff(6个答案)
昨天关门了。
我想学习更多关于异步Javascript的知识。请帮助。
我正在尝试实现的-从json占位符API中检索一个帖子列表;对于posts数组中的每一项,检索用户详细信息,然后将用户详细信息对象添加到posts数组中。2我在本地的Node Js环境中执行此操作。
const fetch = require('node-fetch');
let toggleOne = true;
// Async function to retrieve the user details for a given user Id
const fetchUser = async (userId) => {
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${userId}`)
const json = await response.json();
return json;
}
const addUserDetails = (posts) => {
return new Promise((resolve, reject) => {
posts.map(post => {
fetchUser(post.userId)
.then(userDetails => {
// Print once to determine the sequence of operation
toggleOne ? console.log('Adding user.') : ''
toggleOne = false;
// add user details retrieved from fetchUser function to the posts object
post.userDetails = userDetails
return post
})
.catch(err => reject(err))
})
resolve(posts);
})
}
// Async function to retrieve all posts
const fetchPosts = async () => {
const response = await fetch('https://jsonplaceholder.typicode.com/posts');
const posts = await response.json();
return posts
}
fetchPosts()
.then(posts => addUserDetails(posts))
.then(postsWithUserDetails => {
console.log(postsWithUserDetails[0])
})
.catch(err => console.log(err))
我希望console.log(postsWithUserDetails[0])
打印如下:
{
userId: 1,
id: 1,
title: 'sunt aut facere repellat provident occaecati excepturi optio reprehenderit',
body: 'quia et suscipit\n',
userDetails: { ... }
}
但其下方的打印内容是第一个API请求的输出。
{
userId: 1,
id: 1,
title: 'sunt aut facere repellat provident occaecati excepturi optio reprehenderit',
body: 'quia et suscipit\n'
}
我相信我犯了一个错误,过早地解决了承诺,但不能想出如何让它发挥作用。
如有任何建议,我们将不胜感激。非常感谢。
1条答案
按热度按时间w8f9ii691#
您没有返回
posts.map()
的结果,这是主要问题,您还解决了数组中的所有承诺。以下是我的版本(未经测试,但希望能有所帮助)