2013-06-21 6 views
8

API呼び出しは、結果の次の 'ページ'を返します。どのように私はその結果のコールバックを上品に再帰的に扱うのですか?node.jsのAPIコールバックで非同期に再帰する方法はありますか?

var url = 'https://graph.facebook.com/me/?fields=posts&since=' + moment(postFromDate).format('YYYY-MM-DD') + '&access_token=' + User.accessToken; 
request.get({ 
    url: url, 
    json: true 
}, function (error, response, body) { 
    if (!error && response.statusCode == 200) { 
     _.each(body.posts.data, function (post) { 
      User.posts.push(post); //push some result 
     }); 
     if (body.pagination.next) { // if set, this is the next URL to query 
      //????????? 
     } 
    } else { 
     console.log(error); 
     throw error; 
    } 

}); 

答えて

17

私は関数内で呼び出しをラップ示唆し、必要になるまでそれを呼び出し続けるだろう。ここでは

は、私がこれを行うために必要な場所の一例です。

また、プロセスが終了したことを知らせるコールバックを追加します。

function getFacebookData(url, callback) { 

    request.get({ 
     url: url, 
     json: true 
    }, function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
      _.each(body.posts.data, function (post) { 
       User.posts.push(post); //push some result 
      }); 
      if (body.pagination.next) { // if set, this is the next URL to query 
       getFacebookData(body.pagination.next, callback); 
      } else { 
       callback(); //Call when we are finished 
      } 
     } else { 
      console.log(error); 
      throw error; 
     } 

    }); 
} 

var url = 'https://graph.facebook.com/me/?fields=posts&since=' + 
    moment(postFromDate).format('YYYY-MM-DD') + '&access_token=' + User.accessToken; 

getFacebookData(url, function() { 
    console.log('We are done'); 
}); 
+0

ありがとうございます。今明らかです。ちなみに、私は関数getFacebookData()とvar getFacebookData = function()を使用する理由がありますか? – metalaureate

+1

ハードな理由だけがソフトなものではありません。まずは、少なくとも私が関数を定義するより自然な方法です。第2に、 "var"を忘れてしまった場合は、グローバル関数になります。そして3番目に最も有用です - このように宣言された場合、関数は匿名ではなく名前を持ちます。これはそれを使用しています。それらの中で最も簡単なのは、スタックトレースに表示されます。 – DeadAlready

関連する問題