使用数组在node.js中顺序执行

时间:2014-08-06 17:46:03

标签: javascript node.js

我在node.js中学习顺序执行,并遇到了一个有趣的问题。

以下是我的代码。基本上,我在一个数组中有5个RSS源,我试图按顺序输出它们的标题。为此,我创建了一个函数数组,并从书中使用了这个辅助函数:

function next(err, result)
{
    if(err) throw new Error(err);

    var currentTask = tasks.shift();

    if(currentTask)
    {
        currentTask(result);
    }

}

现在,我的程序正常工作,如果我将数组准备为:

tasks = [

function(){handle(urls[0])},
function(){handle(urls[1])},
function(){handle(urls[2])},
function(){handle(urls[3])},
function(){handle(urls[4])}

];

然而,如果我准备为:

,它以随机顺序输出而不是顺序输出
tasks = [

handle(urls[0]),
handle(urls[1]),
handle(urls[2]),
handle(urls[3]),
handle(urls[3]),

];

上述2个数组有什么区别?

完整代码:

var request = require('request');
var parser = require('htmlparser');

var urls = ['http://psychcentral.com/blog/feed/rss2/', 'http://davidicuswong.wordpress.com/feed/', 'http://www.theglobalconversation.com/blog/?feed=rss2', 'http://happiness-project.com/feed', 'http://www.marriagemissions.com/feed/'];

function handle(url)
{
    request(url, function(error, response, body)
    {
        if (!error && response.statusCode == 200)
        {
            var handler = new parser.RssHandler();
            var rssParser = new parser.Parser(handler);

            rssParser.parseComplete(body);

            if (handler.dom.items.length)
            {
                var item = handler.dom.items.shift();
                console.log(item.title);
                console.log(item.link);
            }

           next(null, null);
        }


    });

}

function next(err, result)
{
    if(err) throw new Error(err);

    var currentTask = tasks.shift();

    if(currentTask)
    {
        currentTask(result);
    }

}


tasks = [

function(){handle(urls[0])},
function(){handle(urls[1])},
function(){handle(urls[2])},
function(){handle(urls[3])},
function(){handle(urls[4])}

];

next();

1 个答案:

答案 0 :(得分:1)

  

上述2个数组有什么区别?

嗯,第一个是函数数组,第二个是undefined s的数组。

  

但是为什么它仍以随机顺序执行和输出呢?

正在执行它(而不是next()队列),并且它们并行执行,因此异步回调以非确定性顺序返回。