我有一个异步函数,可以从 csv 文件中读取网站列表。
async function readCSV(){
const fileStream = fs.createReadStream('./topm.csv');
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity
});
for await (const line of rl) {
var currentline=line.split(",");
var res_server_http = await check_page("http://www."+currentline[1])
}
}
每次我阅读一个网站时,我都会调用 check_page 函数来执行一些操作。 每次我有一个时,我都会等待它的结束,然后再开始新的站点。
async function check_page(web_page){
// do some operations....
}
到目前为止它工作正常,但现在我必须将我的代码与网络爬虫集成。
在 readCSV
函数中,我必须为我阅读的每个站点调用它,并且对于每个我应该调用的站点 check_page
函数。
现在我以这种方式编辑了 readCSV
:
const fileStream = fs.createReadStream('./topm.csv');
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity
});
for await (const line of rl) {
var currentline=line.split(",");
await (new Promise( resolve => {
new Crawler().configure({depth: 2})
.crawl(site, async (page) => {
//console.log(page.url);
var res_server_http = await check_page("http://www."+currentline[1])
// Resolve here
resolve();
});
}));
}
我将此代码用于网络爬虫:https://www.npmjs.com/package/js-crawler
此功能现在不起作用,因为它不是异步的。 如何更改我的代码?
现在我有这个错误:
(node:907) UnhandledPromiseRejectionWarning: ReferenceError: site is not defined
at /Users/francesco/Desktop/tesi/crawler.js:55:14
at new Promise (<anonymous>)
at readCSV (/Users/francesco/Desktop/tesi/crawler.js:53:12)
at processTicksAndRejections (internal/process/task_queues.js:97:5)
(node:907) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这个错误要么是因为在没有 catch 块的情况下抛出了异步函数,要么是因为拒绝了一个没有用 .catch() 处理过的承诺。要在未处理的承诺拒绝时终止节点进程,请使用 CLI 标志 --unhandled-rejections=strict
(请参阅 https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝编号:2)
(节点:907)[DEP0018] 弃用警告:不推荐使用未处理的承诺拒绝。将来,未处理的承诺拒绝将以非零退出代码终止 Node.js 进程。
答案 0 :(得分:0)
添加Promise
:
for await (const line of rl) {
var currentline=line.split(",");
await (new Promise( resolve => {
new Crawler().configure({depth: 2})
.crawl(site, async (page) => {
//console.log(page.url);
var res_server_http = await check_page("http://www."+currentline[1])
// Resolve here
resolve();
});
}));
}