node.js:结构多个API请求,对其进行处理并组合



目前,我正在与Node.js(我是新手)进行不同的API请求(USABILLA API),工作结果,然后结合起来以工作以工作在整个集合中(例如导出)。请求API不是问题,但我无法获得结果来做其他事情(异步代码使我发疯)。

附带,请找到一个概述,我想如何做到这一点。也许我对此完全错了,或者您还有其他更优雅的建议。

我的代码有效,直到我必须请求两个不同的API"地址"(提供),然后提取结果以执行其他事情。我的问题是有嵌套的功能有一个承诺,我无法弄清楚如何通过瀑布内的父函数通过下一个功能来处理。

在代码中,当然没有图表中所示的平行。多数民众赞成在另一点,该怎么做?只需筑巢和平行的串联/另一个瀑布?我有点困惑,因为当使用同步代码完成此操作时,这会变得越来越复杂。

在这里,我建立了所有我的请求查询(目前4):

 function buildQuery(IDs,callback){ 
  var i = 0;
  var max = Object.keys(IDs).length;
  async.whilst(
    function(){return i < max},
    function(callback){
      FeedbackQuery[i] =
      {
        identifier: IDs[i].identifier,
        query:
          {id: IDs[i].id,
            params: {since:sinceDate,}
          }
      };
      i++;
      callback(null,i);
    })
    console.log(FeedbackQuery);
    callback (null,FeedbackQuery);
};

i然后必须决定它是哪种类型的查询,并将其添加到应包含此标识符类型的所有项目的对象中:

function FeedbackRequest(FeedbackQuery,callback)
{
        var i = 0;
        var max = Object.keys(FeedbackQuery).length;
        async.whilst(
          function(){return i < max},
          function (callback){
            identifier = FeedbackQuery[i].identifier;
            APIquery = FeedbackQuery[i].query;
            switch(identifier)
            {
              case 'mobilePortal':
              console.log(FeedbackQuery[i].identifier, 'aktiviert!');
              var result = api.websites.buttons.feedback.get(APIquery);
              result.then(function(feedback)
              {
                var item = Object.keys(feedbackResults).length;
                feedbackResultsA[item] = feedback;
                callback(null, feedbackResultsA);
              })
            break;
              case 'apps':
              console.log(FeedbackQuery[i].identifier, 'aktiviert!');
              var result = api.apps.forms.feedback.get(APIquery);
              result.then(function(feedback)
              {
                var item = Object.keys(feedbackResults).length;
                feedbackResultsB[item] = feedback;
                callback(null, feedbackResultsB);
              })
            break;
            }
            i++;
            callback(null,i);
          })
};

当前功能捆绑在异步瀑布中:

async.waterfall([
  async.apply(buildQuery,IDs2request),
  FeedbackRequest,
  // a function to do something on the whole feedbackResults array
],function (err, result) {
// result now equals 'done'
if (err) { console.log('Something is wrong!'); }
    return console.log('Done!');
  })

实际应该如何:结构

非常感谢您提供的任何提示!

我不熟悉异步,我相信,如果您是新手,这比像bluebird这样的简单承诺库与lodash for helpers for Helpers更难。

我会根据您的模式做什么:

var firstStepRequests = [];
firstStepRequests.push(buildQuery());// construct your first steps queries, can be a loop, goal is to have firstStepRequests to be an array of promise.
Promise.all(firstStepRequests)
.then((allResults) => {
 var type1 = _.filter(allResults, 'request_type_1');
 var type2 = _.filter(allResults, 'request_type_2');
 return {
    type1: type1,
    type2: type2
 };
})
.then((result) => {
   result.type1 = //do some work
   result.type2 = //do some work
   return result; 
})
.then((result) => {
   //export or merge or whatever.
});

目标是拥有一个简单的状态机。

更新

如果要保留请求的标识符,则可以使用道具具有:

var props = {
  id_1:Promise,
  id_2:Promise,
  id_3:Promise
};
Promise.props(props).then((results) => {
 // results is {
  id_1:result of promise,
  id_2:result of promise,
etc...
}
})

您可以做类似的事情:

var type1Promises = getType1Requests(); //array of type 1
var type2Promises = getType2Requests(); // array of type 2
var props = {
   type_1: Promise.all(type1Promises),
   type_2: Promise.all(type2Promises)
}
Promise.props(props).then((result) => {
   //result is : {
     type_1: array of result of promises of type 1
     type_2: array of result of promises of type 2
   }
})

最新更新