1

В настоящее время я разрабатываю веб-приложение, которое использует API-интерфейс Facebook Graph.Как получить все сообщения пользователя через Facebook Graph API, используя обещания и рекурсию?

Что бы я хотел достичь, так это получить все посты пользователя.

Однако это не так просто, так как мне приходится разбивать на страницы результаты.

В настоящий момент я борюсь с обещаниями.

То, что я пытаюсь достичь, - заполнить массив объектами сообщения.

Поэтому я использую обещания и рекурсию, которая не работает должным образом.

Мой код в настоящее время выглядит следующим образом:

// 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, но при входе в массив сообщений много сообщений отсутствуют ,

Я уверен, что я сделал что-то не так с обещаниями, но я не знаю, что.

Я был бы рад, если бы кто-нибудь мог привести меня к решению.

Заранее спасибо.

ответ

5

Попробуйте это:

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 будет использовать его внутренне.

+0

Я получаю все сообщения, но его немного странный массив содержит четыре объекта, каждый из которых имеет некоторые из сообщений. – mian

+0

Я вижу, что вы изменили с 'push' на' concat', но я не получаю никаких сообщений с concat, тогда как я делаю это с 'push'. – mian

+0

concat предназначен для объединения массивов. проверьте, что вы получаете с console.log (response.data) прямо перед линией concat. см., если все записи находятся там. Кроме того, вы не получите ВСЕ записи, если ваша временная шкала очень длинная. рано или поздно это может быть проблемой с ограничениями api ... поэтому я установил предел 100 (по умолчанию 25). вы можете позже ограничить количество вызовов API. – luschn

Смежные вопросы