javascript - 如何在javascript中的promise之后返回值

标签 javascript node.js web-scraping

这段代码有什么问题?

我想用 X 射线包抓取多个网址

当我运行该函数时,我得到“{ title: [] }”

const Xray = require('x-ray');
const x = Xray();
const createCustomMedium = () => {
  const medium = { title: [] };
  const urls = [
    'https://medium.com./topic/javascript',
    'https://medium.com./topic/programming'
  ];
  urls.forEach(elem => {
    x(elem, {
      titles: ['article h4']
    })
      .then(articles => {
        medium.title.push(...articles.titles);
      })
      .catch(console.log);
  });
  return medium;
};
const scraped = createCustomMedium();
console.log(scraped);

最佳答案

您可能想查看Promise.all并做这样的事情:

const createCustomMedium = () => new Promise((resolve, reject) => {
  const urls = [
    'https://medium.com./topic/javascript',
    'https://medium.com./topic/programming'
  ];

  Promise.all(urls.map(elem => x(elem, { titles: ['article h4'] })))
    .then(result => result.reduce((titles, articles) => titles.concat(articles.titles), []))
    .then(titles => resolve({ title: titles }))
    .catch(reject);
})

createCustomMedium()
  .then(scraped => console.log(scraped));

其中返回每次调用 x(..) 的 promise 列表:

urls.map(elem => x(elem, { titles: ['article h4'] }))

关于javascript - 如何在javascript中的promise之后返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60467450/

相关文章:

Python scrapy reddit 确认按钮中断抓取

javascript - 递归调用返回 promise 的异步函数

javascript - 如何使用 javascript 在 firefox 中关闭窗口?

JavaScript let 绑定(bind)不应添加到全局对象中,浏览器、Node 和 jsfiddle 中的行为不同

javascript - Node.js Knex SQL 插入太慢

javascript - 如何使用 Nodejs 抓取 QlikView 表?

javascript - 克隆没有值的文本字段

javascript - 语义用户界面 : How to define selected item of search dropdown ("<select>")?

unit-testing - node.js 中 require() 的成本是多少?

javascript - 如何解决错误:Puppeteer 中的 net::ERR_CONNECTION