【问题标题】:nodejs async: multiple dependant HTTP API callsnodejs async:多个依赖的 HTTP API 调用
【发布时间】:2014-06-02 04:36:33
【问题描述】:

我正在开展一个项目,该项目涉及向不同的 API 发出多个 HTTP GET 请求,每个请求都需要最后一个的信息。我试图避免嵌套回调和反地狱,并一直试图让它与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 来获取更多数据。当该调用返回时,我需要将其插入到正确的讲师对象中。

最后,当一切都完成后,数据会被传递到一个模板以供 express 呈现并返回给客户端。

我已经尝试使用async 来实现这项工作,并且在进行概念验证时使用async.waterfall 取得了一些成功,只获得了一个讲师简介(例如,不循环数组,只是获得讲师[ 0])。 async 模块的文档很全面,但是非常密集,我很难确定我真正需要做什么。我有各种嵌套异步调用的科学怪人组合,但仍然无法正常工作。

我真的不在乎我是如何完成任务的——流程控制、承诺、魔法精灵粉等等。任何提示都非常感谢。

【问题讨论】:

    标签: node.js asynchronous async.js


    【解决方案1】:

    将 Q 用于 Promise,您可能可以执行以下操作:

    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 值中的一组讲师数据。

    【讨论】:

    • 我决定为此尝试承诺。我已经迈出了第一步,获取课程大纲,开始工作;这很愚蠢 - 容易。我无法弄清楚如何承诺下一部分,为课程获取每位讲师的个人资料并将它们塞入正确的位置。我已经让它以普通方式工作,使用回调和计数器。 gist.github.com/grahamb/11306874
    【解决方案2】:

    您可以使用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');
    });
    

    【讨论】:

      猜你喜欢
      • 2016-12-27
      • 2021-03-10
      • 1970-01-01
      • 2021-05-22
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      相关资源
      最近更新 更多