How to retrieve all posts of a user via Facebook Graph API using promises and recursion?

时光总嘲笑我的痴心妄想 提交于 2019-12-08 02:56:32

问题


I am currently developing a web app which uses the Facebook Graph API.

What I would like to achieve is to get all posts of a user.

However, this is not that easy since I have to paginate the results.

At the moment I am struggeling with promises.

What I try to achieve is to fill an array with the post objects.

Therefore I use promises and recursion which does not work as expected.

My code currently looks as follows:

// Here I retrieve the user with his or her posts,
// just the first 25 due to pagination
if (accessToken) {
  return new Promise(resolve => {
    FB.api('/me?fields=id,name,posts&access_token=' + accessToken, response => {
      this.get('currentUser').set('content', response);
      resolve()
    })
  })
}

// Returns all posts of a given user
function getAllPostsOfUser(posts, postsArr) {
  // Process each post of the current pagination level
  for (var post of posts.data) {
    // Only store meaningful posts
    if (post !== undefined && post.message !== undefined) {
      postsArr.push(post)
    }
  }

  // Further posts are retrievalable via paging.next which is an url
  if (posts.data.length !== 0 && posts.paging.next !== undefined) {
    FB.api(posts.paging.next, response => {
      getAllPostsOfUser(response, postsArr)
      resolve()
    })
  }

  return postsArr
}

var posts = getAllPostsOfUser(this.get('currentUser').content.posts, [])
// I want to use all the posts here
console.log(posts)

The problem I have is that I want to use the posts where the console.log is placed but when I log the posts array a lot of posts are missing.

I am sure that I did something wrong with the promises but I do not know what.

I would be glad if anyone could guide me to a solution.

Thank you in advance.


回答1:


Try this:

function getAllPosts() {
    return new Promise((resolve, reject) => {
        let postsArr = [];
        function recursiveAPICall(apiURL) {
            FB.api(apiURL, response => {
                if (response && response.data) {
                    //add response to posts array (merge arrays), check if there is more data via paging
                    postsArr = postsArr.concat(response.data);
                    if (response.paging && response.paging.next) {
                        recursiveAPICall(response.paging.next);
                    } else {
                        resolve(postsArr);
                    }
                } else {
                    reject();
                }
            })
        }
        recursiveAPICall('/me/posts?fields=message&limit=100');
    }
}

getAllPosts().then(response => {
    console.log(response);
}).catch(e => {
    console.log(e);
});

Not tested, just a quick example i came up with. It returns a promise and uses a recursive function to get all entries. Btw, you don´t need to add the Access Token. If you are logged in, the SDK will use it internally.



来源:https://stackoverflow.com/questions/37621010/how-to-retrieve-all-posts-of-a-user-via-facebook-graph-api-using-promises-and-re

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!