我来自 PHP 背景,试图围绕“事件驱动”的 Node.js 环境。我编写了一个小脚本,它从目录中读取文件并使用节目名称、季节和剧集编号(如果它们晚于数据库中当前存储的内容)更新 Redis。看来我遇到了一个异步问题,我无法完全理解 Redis DB 的标题是“My Show”、“05”季和“01”的标题。有两个文件被读取,其中包含“My Show S05E02”和“My Show S05E01”。
仅当季节/剧集晚于当前季节/剧集时,数据库才应更新,但是由于“updateTitle”的调用速度非常快,并且由于某种原因,“My Show S05E02”在“My Show S05E01”之前传递,因此更新功能始终将这两个值与原始值“My Show S05E01”进行比较,因此它使用 E02 更新 Redis,然后再次使用 E01!
这是代码:
function processFiles()
{
fs.readdir(WATCH_DIR, function(err, files){
for (var i = 0; i <= files.length; i++)
{
checkFile(files[i]);
}
});
}
function updateTitle(title, season, episode)
{
var cur_season, cur_episode;
redis_client.hget(title, 'Season', function(err, data){
cur_season = data;
redis_client.hget(title, 'Episode', function(err, data){
cur_episode = data;
redis_client.sismember('Titles', title, function(err, data){
console.log('comparing S'+season+'E'+episode+' to current S'+cur_season+'E'+cur_episode);
if ((season == cur_season && episode >= cur_episode) || season > cur_season)
{
redis_client.hset(title, 'Season', season);
redis_client.hset(title, 'Episode', episode);
console.log('setting '+title+' S'+season+'E'+episode);
}
});
});
});
}
function checkFile(file, mtime)
{
var reg = new RegExp("^"+FILE_PREFIX);
var seasoned = new RegExp("S(\\d{2})E(\\d{2})", "i");
var cache = {}
if (reg.test(file))
{
fs.stat(WATCH_DIR + file, function(err, stats){
console.log(file, stats.mtime.toLocaleDateString() +' '+ stats.mtime.toLocaleTimeString() );
fs.readFile(WATCH_DIR + file, 'utf8', function(ferr, data){
if (seasoned.test(data))
{
title = data.replace(/S(\d{2})E(\d{2})(.*?)$/, '')
.replace(/[\._\-]+/, ' ')
.replace(/^\s+/, '')
.replace(/\s+$/, '');
var season = data.match(/S(\d{2})/i);
season = season[1];
var episode = data.match(/E(\d{2})/i);
episode = episode[1];
updateTitle(title, season, episode);
}
});
});
}
}
fs.watch(WATCH_DIR, function(type, file){
if (type == 'change')
{
processFiles();
}
});
任何帮助,将不胜感激。我敢肯定这里还有其他错误或最佳实践,也请随时分享这些 - 但我只是想弄清楚异步问题!
仅供参考 - 这只是一个宠物项目,这样我就可以记住我目前在观看我喜欢看的每个节目的哪一集。