javascript NodeJS -如何调用一个API,接收结果数组,然后触发多个API调用并合并结果?[duplicate]

nkcskrwz  于 2023-01-16  发布在  Java
关注(0)|答案(1)|浏览(133)
    • 此问题在此处已有答案**:

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'
}

我相信我犯了一个错误,过早地解决了承诺,但不能想出如何让它发挥作用。
如有任何建议,我们将不胜感激。非常感谢。

w8f9ii69

w8f9ii691#

您没有返回posts.map()的结果,这是主要问题,您还解决了数组中的所有承诺。
以下是我的版本(未经测试,但希望能有所帮助)

const addUserDetails = (posts) => {
  return Promise.all( 
    posts.map(async post => {
      const userDetails = await fetchUser(post.userId);
      post.userDetails = userDetails;
      return post;
    })
  })
}

相关问题