const rp = require( 'request-promise' );
const cheerio = require('cheerio');
async function scrapItem() {
const item_url='some dummy url';
const html = await rp(item_url);
const $ = cheerio.load(html);
const items = [];
$('li').each(function(i, e) {
const name = $(this).text();
items.push(name);
}
return items;
}
scrapItem().then( function(items) {
console.log(items);
}
上面的代码运行得很好。我成功打印了所有物品。
但是当我按照以下嵌套方式刮取该项目时,它甚至在完成刮取之前就已经返回;
const rp = require( 'request-promise' );
const cheerio = require('cheerio');
async function scrapDetails(url) {
const html = await rp(url);
const $ = cheerio.load(html);
const details = [];
$('li').each(function(i, e) {
const price = $(this).text();
const weight = $(this).next().text();
details.push({'price': price, 'weight': weight});
}
return Promise.resolve(details);
}
async function scrapItems() {
const items_url='some dummy url';
const html = await rp(items_url);
const $ = cheerio.load(html);
const items = [];
await $('li').each( async function(i, e) {
const name = $(this).text();
const url = $(this).children().first().attr('href');
const details = await scrapDetails(url);
items.push({'name': name, 'details': details});
}
return Promise.resolve(items);
}
scrapItems().then( function(items) {
console.log(items);
}
上面的代码只需打印
[]
这表示项目为空。
但是当我在scrapDetails中打印细节时,我可以成功打印出所有内容。
我知道我可以重构程序,以便将所有url都刮到一个列表中,然后在for循环中刮擦每个项目。但是我只是在问为什么即使在等待结束之前就执行返回。还是每个都不支持等待?