在node.js中等待

时间:2019-04-04 20:01:45

标签: node.js cheerio

我正在尝试制作一个网络爬虫,但是我无法让我的函数等待第二个请求来填充对象上的名称键。它总是返回undefined。

const request = require('request');
const cheerio = require('cheerio');
const base_url = 'https://www.supremenewyork.com';
const shop_url = 'https://www.supremenewyork.com/shop/';

function getItems(category) {
    var items = [];
    return new Promise(function(resolve, reject) {
        request.get(shop_url + category, function(err, res, body) {
            if(err) {
                reject(err);
            } else {
                var $ = cheerio.load(body);
                $('a', '.inner-article').each(function(i, el) {
                    var url = base_url + $(this).attr('href');
                    var isSoldout = false;
                    var name;
                    if($(this).find('div').attr('class', 'sold_out_tag').length === 1)
                        isSoldout = true;
                    request.get(url, function(err, res, html) {
                        var $ = cheerio.load(html);
                        name = $('h1', 'div').text();
                    })
                    items.push({name: name, url: url, isSoldout: isSoldout});
                })
                resolve(items);
            }
        })
    })
}

我希望姓名键可以填写,但是不可以,我不确定

1 个答案:

答案 0 :(得分:0)

使用将request-promise包裹在request中的Promise包。然后,您可以使用async/await等待结果,例如:

const rp = require('request-promise');
const cheerio = require('cheerio');
const base_url = 'https://www.supremenewyork.com';
const shop_url = 'https://www.supremenewyork.com/shop/';

// notice async keyword
async function getItems(category) {
  var items = [];
  try {
    // using await to wait for promise to resolve
    const body = await rp.get(shop_url + category)
    var $ = cheerio.load(body);
    $('a', '.inner-article').each(function(i, el) {
      var url = base_url + $(this).attr('href');
      var isSoldout = false;
      var name;
      if($(this).find('div').attr('class', 'sold_out_tag').length === 1)
        isSoldout = true;
      try {
        const html = await rp.get(url)
        var $ = cheerio.load(html);
        name = $('h1', 'div').text();
        items.push({name: name, url: url, isSoldout: isSoldout});
      } catch (err) {
        throw err;
      }
    })
  } catch (e) {
    throw e;
  }
  return items;
}

有关MDN上的async/await的更多信息