node.js - 回调函数返回主函数的值
问题描述
我正在使用这个爬虫库来爬取特定页面并获取网站标题,为此我正在使用 express 和该库:
app.get('/crawler/', function(req, res){
var returnedTitle = crawlerTest(req.query.urlsite);
res.send({'title' : returnedtitle});
res.end();
});
function crawlerTest(urlsite){
var c = new Crawler({
maxConnections : 10,
// This will be called for each crawled page
callback : function (error, res, done) {
if(error){
console.log(error);
}else{
var $ = res.$;
// $ is Cheerio by default
//a lean implementation of core jQuery designed specifically for the server
console.log($("title").text());
}
done();
}
});
// Queue just one URL, with default callback
c.queue(urlsite);
}
在上面的代码中,我使用了库本身的基本示例。
在这种情况下,该crawlerTest
函数进入站点并可以提取页面标题。
但是有一个缺陷,我需要想办法将网站标题$("title").text()
直接返回给crawlerTest
函数,以便returnedTitle
变量可以存储网站标题以发送响应res.send()
我知道我们应该总是done()
为每个抓取的页面调用函数,但我想不出办法来做到这一点。
解决方案
这工作我刚刚从 crawlerTest 函数返回了承诺。
app.get('/crawler/', async function(req, res){
var returnedTitle = await crawlerTest(req.query.urlsite);
res.send({'title' : returnedtitle});
res.end();
});
function crawlerTest(urlsite){
return new Promise((resolve,reject)=>{
var c = new Crawler({
maxConnections : 10,
// This will be called for each crawled page
callback : function (error, res, done) {
if(error){
console.log(error);
reject(error);
}else{
var $ = res.$;
// $ is Cheerio by default
//a lean implementation of core jQuery designed specifically for the server
console.log($("title").text());
resolve($("title").text());
}
done();
}
});
// Queue just one URL, with default callback
c.queue(urlsite);
});
}
推荐阅读
- flutter - TabBarView 中的 Flutter ListView.builder 引发 hitTest 错误
- c# - Office 互操作通过任务计划程序运行
- automation - Cypress 是否支持与 DB2 数据库的交互?
- r - 将多个小标题导出到 XLSX -- 使用 deparse(substitute()) 时的 sheetName 问题
- android - 将音频文件转换为样本数组
- twilio - 列出 Twilio 电话号码时识别 Whatsapp 电话号码
- javascript - 如何在javascript中使用具有短签名的密钥对数据进行签名
- file - Flutter:Google Drive:文件列表总是返回我 0
- c# - 不属于 windows 组或活动目录的人将如何访问 TFS 项目?
- batch-file - 如何在 Windows 批处理文件中指定打开 spyder、更改工作目录并运行脚本?