nodejs递归地从不同的REST端点获取所有页面

时间:2018-02-27 11:45:34

标签: javascript node.js

我有点挣扎我的JavaScript。仍然围绕着回调。我有一个函数,它从REST端点递归地获取下一个链接页面。它适用于单个URL

现在我需要使用相同的recrusive函数为其他端点做同样的事情。那就是我现在挣扎的地方。很明显,我错过了一点,或者我非常理解回调概念。

请原谅我到目前为止所做的格式化..

function getFullLoad(rest_url,callback){
    mongoose.connect(url, function(err) {
    console.log(url);
    if (err) throw err;
    console.log("successfully connected");
    getToken(function(err, token) {
        if (err) throw console.error(err);
         console.log('using access token to retrieve data :', token[0]
          ['access_token']);
  var options = {
    'auth': {
      'bearer': token[0]['access_token']
    }
  } 
   request.get(rest_url, options, function(error, response, body) {
       if (!error && response.statusCode === 200) {
          var data = JSON.parse(body);
          //save data in mongo
         });
       }
      var next_page = JSON.parse(body)["_links"]["next"]
      if (next_page) {
        var next_page_url = JSON.parse(body)["_links"]["next"]["href"];
        console.log("Fetching data from ", next_page);
        //recrusively call back with next url
         getFullLoad(next_page_url,callback);
        } else {
           callback();
      } else {
         if (error) throw error;
      }
   });
rest_url= "http://myrest_url"
//this bit is working if there is a single url
getFullLoad(rest_url, function() {
console.log('done , got all data');
 });

这很好用,现在我需要用不同的url调用相同的函数。可能有些网址可能没有分页。

到目前为止,这是我的努力,它只需要第一个网址然后什么也不做。 这个位不起作用。我做错了什么?我尝试创建另一个回调函数。我想我的知识在回调上非常有限。任何帮助非常感谢

    api_endpoints =[ {"url1": "http://url1"},{"url2": "http://url2"}]
    api_endpoints.forEach(function(Item, endpoint) { 
    var endpoint_name = Object.keys(api_endpoints[endpoint]).toString());
    var rest_url = api_config.BASE_URL + api_endpoints[endpoint]   
                   [endpoint_name];
    getFullLoad(rest_url, function) {
     console.log('done');
         });
           });

感谢您查看我的问题

1 个答案:

答案 0 :(得分:0)

通过一些重构,我认为你可以得到一些工作。

我会改变你的getFullLoad方法来返回一个promise(request.get)然后在你的foreach循环中我会构建一个promises数组,用不同的url调用getFullLoad。

然后使用promises.all(arrayOfPromises)执行它们并管理结果。

长期理解和维护会更容易。

查看承诺文档:

Promise.all