目前,我正在与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
}
})