2013-06-21 122 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

沒有硬性的理由只有軟的和那些 - 首先它至少對我來說是一種更自然的定義函數的方式,其次,如果你忘記了「var」,那麼它將成爲一個全局函數。第三,也是最有用的 - 如果以這種方式聲明,函數將會有一個名字,而不是匿名的。這是它的用途。最簡單的是 - 它會顯示在堆棧跟蹤中。 – DeadAlready