Javascript 如何使用承诺和递归通过Facebook Graph API检索用户的所有帖子?

Javascript 如何使用承诺和递归通过Facebook Graph API检索用户的所有帖子?,javascript,facebook-graph-api,recursion,facebook-javascript-sdk,es6-promise,Javascript,Facebook Graph Api,Recursion,Facebook Javascript Sdk,Es6 Promise,我目前正在开发一个使用Facebook Graph API的web应用程序 我想实现的是获得一个用户的所有帖子 然而,这并不是那么容易,因为我必须对结果进行分页 此刻,我正努力履行诺言 我试图实现的是用post对象填充数组 因此,我使用了承诺和递归,但它们并没有像预期的那样工作 我的代码目前如下所示: // Here I retrieve the user with his or her posts, // just the first 25 due to pagination if (acce

我目前正在开发一个使用Facebook Graph API的web应用程序

我想实现的是获得一个用户的所有帖子

然而,这并不是那么容易,因为我必须对结果进行分页

此刻,我正努力履行诺言

我试图实现的是用post对象填充数组

因此,我使用了承诺和递归,但它们并没有像预期的那样工作

我的代码目前如下所示:

// 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)
我遇到的问题是,我想使用放置console.log的posts,但当我记录posts数组时,会丢失很多posts

我确信我对承诺做了一些错事,但我不知道是什么

如果有人能给我一个解决方案,我会很高兴的

提前谢谢。

试试这个:

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);
});

没有测试,只是我举了一个简单的例子。它返回一个承诺,并使用递归函数获取所有条目。顺便说一句,您不需要添加访问令牌。如果您登录,SDK将在内部使用它。

我知道所有帖子,但有点奇怪,数组包含四个对象,每个对象都有一些帖子。我看到您从
push
更改为
concat
,但我不使用concat检索任何帖子,而使用
push
。concat用于合并数组。查看concat行前面的console.log(response.data)的内容。看看是否所有的条目都在那里。另外,如果你的时间线很长,你可能不会得到所有的条目。迟早,api限制可能会有问题……这就是为什么我将限制设置为100(默认值为25)。您可能希望以后限制API调用的数量。我只需要在concat前后获得一个空数组。然后尝试使用console.log(response)。