nodejsasynchronous:多个相关的HTTP API调用

我正在开发一个项目,其中包括向不同的API发出多个HTTP GET请求,每个请求都需要最后的信息。 我试图避免嵌套callaback和反地狱,并试图让它与async模块的工作。

这是我需要做的:我有一个1..n课程标识符( ['2014/summer/iat/100/d100', '2014/spring/bisc/372/d100'] )。 对于数组中的每门课程,我需要通过HTTP GET获取其课程大纲。

产生的大纲看起来像这样:

 { "info": { "nodePath": "2014/spring/bisc/372/d100", "number": "372", "section": "D100", "title": "Special Topics in Biology", "term": "Spring 2014", "description": "Selected topics in areas not currently offered...", "name": "BISC 372 D100", "dept": "BISC", }, "instructor": [ { "lastName": "Smith", "commonName": "Frank", "phone": "1 555 555-1234", "email": "franksmith@school.edu", "name": "Frank Smith", "roleCode": "PI" }, { "lastName": "Doe", "commonName": "John", "phone": "1 555 555-9876", "email": "johndoe@school.edu", "name": "John Doe", "roleCode": "PI" } ] } 

(一堆不相关的领域被省略)

每个轮廓对象可以包含一个instructor属性,该属性是该课程的0..n个指导者对象的数组。 对于instructor数组的每个成员,我需要调用另一个API来获取其他数据。 当该调用返回时,我需要将其插入到正确的教师对象中。

最后,当一切都完成后,数据被传递给一个模板,以便快速渲染并返回给客户端。

我尝试使用async获得这个工作,并做了async.waterfall一些成功的时候做一个概念validation,只得到一个教师configuration文件(例如不循环数组,只是得到教练[0])。 asynchronous模块的文档是全面的,但非常密集,我很难确定我真的需要做什么。 我有一个科学怪人的各种嵌套的asynchronous调用组合仍然没有工作。

我真的不在乎我如何完成任务 – stream量控制,承诺,魔术小精灵,无论如何。 任何提示不胜感激。

使用Q来承诺,你可以这样做:

 return Q .all(course_ids.map(function(course) { return HTTP.GET(course); // Assuming this returns a promise })) .then(function(course_data) { var instructors = []; course_data.forEach(function(course) { var p = Q .all(course.instructor.map(function(instructor) { return HTTP.GET(instructor.id); })) .then(function(instructors) { course.instructors_data = instructors; return course; }); promises.push(p); }); return Q.all(promises); }); 

将使用包含课程的数组来解决,其中每个课程都包含其instructors_data值中的指导数据数组。

您可以使用async.each() ,它可以并行执行API请求(假设在服务器端没有并发API请求限制,如果是这种情况,请改用async.eachLimit() ):

 async.each(instructors, function(instructor, callback) { // call API here, store result on `instructor`, // and call `callback` when done }, function(err){ if (err) console.log('An error occurred while processing instructors'); else console.log('All instructors have been processed successfully'); });