我在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();
答案 0 :(得分:1)
上述2个数组有什么区别?
嗯,第一个是函数数组,第二个是undefined
s的数组。
但是为什么它仍以随机顺序执行和输出呢?
您正在执行它(而不是next()
队列),并且它们并行执行,因此异步回调以非确定性顺序返回。