cheerio .each异步等待实际上并不等待

时间:2019-03-21 11:37:59

标签: node.js promise async-await cheerio

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循环中刮擦每个项目。但是我只是在问为什么即使在等待结束之前就执行返回。还是每个都不支持等待?

0 个答案:

没有答案