0

これは私の最初の JavaScript & Node プロジェクトで、行き詰まっています….

一連の投稿 ID を返す REST API を呼び出そうとしています...取得した ID のセットに基づいて、最初の API から各 ID の詳細を返す別の API を呼び出そうとしています。コードは、Facebook-NodeSDK が提供する Facebook API を使用します。

私が抱えている問題は、2 番目の API が FOR ループで起動することです…. 私が理解しているように、for ループは各リクエストを非同期的に実行します…. 両方のクエリが実行されているのを確認できますが、2 番目の for ループの最後をキャプチャして最終結果をユーザーに返す方法がわかりません…</p>

以下はコードです…</p>

exports.getFeeds = function(req, res) {

    var posts = [];
    FB.setAccessToken(’SOME TOKEN');
    var resultLength = 0;


     FB.api(
        //ARG #1 FQL Statement
        'fql', { q: 'SELECT post_id FROM stream WHERE filter_key = "others"' },
        //ARG #2 passing argument as a anonymous function with parameter result
        function (result)
           {

               if(!result || result.error) {
                    console.log(!result ? 'error occurred' : result.error);
                    return;
                } //closing if handling error in this block

                    var feedObj
                    console.log(result.data);
                    console.log(result.data.length);

                        for (var i = 0; i<resultLengthj ; i++) {

                        (function(i) {
                            feedObj             = {};
                            FB.api( result.data[ i].post_id,  { fields: ['name', 'description', 'full_picture' ] },
    //                          fbPost is data returned by query
                                function (fbPost) {
                                    if(!fbPost || fbPost.error) {
                                        console.log(!fbPost ? 'error occurred' : result.error);

                                        return;
                                    }
    //                                else
                                        feedObj=fbPost;
                                        posts.push(feedObj);
                            });
                       })(i);
                    }// end for

           }//CLOSE ARG#2 Function

    );// close FB.api Function

注私は呼び出す必要があります….res.Send(post)…。いくつかの場所でそれを呼び出そうとしましたが、すべての投稿を取得できません...上記のコードからコンソールステートメントを削除しました...データが取得されていることを示しています...

あなたの助けと注意をありがとう....

4

2 に答える 2

0

map基本的に、IDごとに非同期操作を実行したいと考えています。

asyncメソッドを持つコレクションに対して非同期操作を行うための非常に便利なライブラリがありasync.mapます。

var async = require('async'); 

FB.api(
    'fql', { q: 'SELECT post_id FROM stream WHERE filter_key = "others"' },
    //ARG #2 passing argument as a anonymous function with parameter result
    function (result) {

        async.map(
            result,

            function (item, callback) {
                FB.api(
                    item.post_id, 
                    { fields: ['name', 'description', 'full_picture' ] }, 
                    callback
                );
            },

            function (err, allPosts) {
                if (err) return console.log(err);

                // Array of all posts
                console.log(allPosts);
            }
        );

    }
);

これを使用する必要はまったくありませんが、コードを少し簡素化します。npm install --save asyncプロジェクトディレクトリで実行するだけで、準備完了です。

于 2014-03-02T02:35:26.457 に答える