我在理解异步函数时遇到了一些麻烦。我已经阅读了Mixu 的 Node Book中的章节,但我仍然无法理解它。
基本上我想请求一个资源(使用节点包cheerio
),解析它以获取有效的 URL,并将每个匹配项添加到我的 redis 集setname
。
问题是最后它只是将第一个匹配添加到 redis 集中。
function parse(url, setname)
{
request(url, function (error, response, body)
{
if (!error && response.statusCode == 200)
{
$ = cheerio.load(body)
// For every 'a' tag in the body
$('a').each(function()
{
// Add blog URL to redis if not already there.
var blog = $(this).attr('href')
console.log("test [all]: " + blog);
// filter valid URLs
var regex = /http:\/\/[^www]*.example.com\//
var result = blog.match(regex);
if(result != null)
{
console.log("test [filtered]: " + result[0]);
redis.sismember(setname, result[0], function(err, reply)
{
if(!reply)
{
redis.sadd(setname, result[0])
console.log("Added " + result[0])
}
redis.quit()
})
}
})
}
})
}
我将非常感谢有关如何重新构建它的指针,以便 redis.sadd 方法使用正确的结果。
当前实现的输出如下所示:
test [all]: http://test1.example.com/
test [filtered]: http://test1.example.com/
...
Added http://test2.example.com/
所以它添加了 test1.example.com 但不打印“添加”行,它没有添加 test2.example.com 但它正在打印“添加”行。
谢谢!