NodeJS:用承诺来解决两个URL的问题

我正在抓取r / theonion并将标题写入文本文件onion.txt。 之后,我打算把这些标题写到文本文件nottheonion.txt中。 我成功地写入onion.txt,但不totheonion.txt。

var onion_url = "https://www.reddit.com/r/theonion"; var not_onion_url = "https://www.reddit.com/r/nottheonion"; var promise = new Promise(function(resolve, reject) { request(onion_url, function(error, response, html) { if (error) { console.log("Error: " + error); } var $ = cheerio.load(html); $("div#siteTable > div.link").each(function(idx) { var title = $(this).find('p.title > a.title').text().trim(); console.log(title); fs.appendFile('onion.txt', title + '\n'); }); }); }); promise.then(function(result) { request(not_onion_url, function(error, response, html) { if (error) { console.log("Error: " + error); } var $ = cheerio.load(html); $("div#siteTable > div.link").each(function(idx) { var title = $(this).find('p.title > a.title').te . xt().trim(); console.log(title); fs.appendFile('not_onion.txt', title + '\n'); }); }); }, function(err) { console.log("Error with scraping r/nottheonion"); }); 

使用request-promisefs-promise来简化你的代码,无论如何你要使用promise,并且使用函数不要重复自己。

 var rp = require('request-promise'); var fsp = require('fs-promise'); var onion_url = "https://www.reddit.com/r/theonion"; var not_onion_url = "https://www.reddit.com/r/nottheonion"; function parse(html) { var result = ''; var $ = cheerio.load(html); $("div#siteTable > div.link").each(function(idx) { var title = $(this).find('p.title > a.title').text().trim(); console.log(title); result += title + '\n'; }); return result; } var append = file => content => fsp.appendFile(file, content); rp(onion_url) .then(parse) .then(append('onion.txt')) .then(() => console.log('Success')) .catch(err => console.log('Error:', err)); rp(not_onion_url) .then(parse) .then(append('not_onion.txt')) .then(() => console.log('Success')) .catch(err => console.log('Error:', err)); 

这没有经过testing。