【问题标题】:How do I optimise this callback hierarchy in my simple express app?如何在我的简单快速应用程序中优化此回调层次结构?
【发布时间】:2017-06-17 13:01:26
【问题描述】:

我正在创建一个简单的 rss 提要聚合器。为此,我使用了一个名为“blind-parser”的模块。该模块解析一个 rss/xml 字符串并返回一个对象。

我的目标是从多个 RSS 提要中获取这些对象并渲染它们。所以我最初是这样做的:

 var obj1 = {},obj2 = {}, obj3 = {};
 app.get('/',function(req,res){ 

    parser.parseURL('https://www.toptal.com/blog.rss', function (err, parsed1) {
        obj1 = parsed1;
    });              
    parser.parseURL('https://www.toptal.com/designers/blog.rss', function (err, parsed2) {
        obj2 = parsed2;
    });
    parser.parseURL('http://jsfeeds.com/feed', function (err, parsed3) {
        obj3 = parsed3;
    });
    parser.parseURL('http://www.mironov.com/feed/', function (err, parsed4) {
        obj4 = parsed4;
    });
    res.render('index', {'toptal': obj1 , 'toptaldesign' : obj2 , 'jsf': obj3 , 'product': obj4 });
});

但是它不起作用,因为 obj1、obj2、obj3 和 obj4 原来是未定义的。 我不明白。我尝试在 app.get 内部和外部声明变量,均无效。

所以我这样做了,

  app.get('/',function(req,res){ 

        parser.parseURL('https://www.toptal.com/blog.rss', function (err, parsed1) {
                parser.parseURL('https://www.toptal.com/designers/blog.rss', function (err, parsed2) {
                    parser.parseURL('http://jsfeeds.com/feed', function (err, parsed3) {
                        parser.parseURL('http://www.mironov.com/feed/', function (err, parsed4) {
                            res.render('index', {'toptal': parsed1 , 'toptaldesign' : parsed2 , 'rs': parsed3 , 'product': parsed4 });
                    });
                });        
            });
        });
    });

瞧,它奏效了!然而,这种方法的主要缺点是,每次我嵌套另一个 rss 链接时,它所花费的时间都会增加 2 倍。

已经加载三层嵌套页面所需的时间约为 20 秒。

有人可以帮我解决这个问题吗,我也是节点新手,所以请详细说明。

谢谢。

【问题讨论】:

    标签: node.js express callback


    【解决方案1】:

    我假设parse.parseURL 函数实际上是在获取指定的 URL 并解析其内容。您的四个 parseURL 请求中的每一个都是异步的,这意味着每个函数都是同步调用的,但是一旦获取了 URL 等,它们的每个回调都会在稍后的某个时间点执行。同时您的 res.render 调用也已运行同步地,紧接在前面的 parseURL 调用之后但在它们的每个回调被调用之前,因此在 obj1 等被设置之前。

    当您在每个回调中嵌套调用时,如在第二个示例中,那么您确保在继续之前获取每个 URL 结果,但是当您按顺序获取每个 URL 时(例如,您不会获取第二个 URL,直到第一个已经返回)那么执行时间会变慢。

    您可以通过并行获取所有四个 URL 来加快处理速度(假设您的请求是同时处理的)。为此,如果您首先使用类似async 的库,或者将代码转换为使用promises,会更简单。如果您使用异步,那么您的代码可以更改为并行获取 URL,如下所示:

    async.parallel([
      ( cb ) => {
        parser.parseURL('https://www.toptal.com/blog.rss', cb );
      },
      ( cb ) => {              
        parser.parseURL('https://www.toptal.com/designers/blog.rss', cb );
      },
      ( cb ) => {
        parser.parseURL('http://jsfeeds.com/feed', cb );
      },
      ( cb ) => {
        parser.parseURL('http://www.mironov.com/feed/', cb );
      }
    ], 
    ( err, results ) => {
      // Called once all requests have completed.
      res.render('index', {'toptal': results[0] , 'toptaldesign' : results[1] , 'jsf': results[2] , 'product': results[3] });
    });
    

    【讨论】:

      猜你喜欢
      • 2010-09-25
      • 2016-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 2011-01-24
      相关资源
      最近更新 更多