亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何承諾等待所有對象完成然后推送到數組?

如何承諾等待所有對象完成然后推送到數組?

撒科打諢 2023-11-02 20:01:11
getURL() 函數從原始 URL 創建一個抓取 URL 的數組。getSubURL() 然后循環遍歷該數組并抓取所有這些頁面的 URL。目前,此代碼可以很好地輸出到控制臺,但我不知道如何等待我的數據解析,以便我可以將所有收集的數據推送到單個數組。目前,當我嘗試返回站點然后推送到數組時,它只推送最后一個值。我相信這是一種promise.all(map) 的情況,但我不知道如何正確編寫而不出現錯誤。理想情況下,我完成的抓取可以在另一個函數中調用。如果可以的話請看一下const cheerio = require('cheerio');const axios = require('axios');let URL = 'https://toscrape.com';const getURLS = async () => {  try {    const res = await axios.get(URL);    const data = res.data;    const $ = cheerio.load(data);    const urlQueue = [];    $("a[href^='http']").each((i, elem) => {      const link = $(elem).attr('href');      if (urlQueue.indexOf(link) === -1) {        urlQueue.push(link);      }    });    return urlQueue;  } catch (err) {    console.log(`Error fetching and parsing data: `, err);  }};const getSubURLs = async () => {  let urls = await getURLS();  try {    //loop through each url in array    for (const url of urls) {      //fetch all html from the current url      const res = await axios.get(url);      const data = res.data;      const $ = cheerio.load(data);      //create object and push that url into that object       let sites = {};      sites.url = url;      let links = [];      //scrape all links and save in links array      $("a[href^='/']").each((i, elem) => {        const link = $(elem).attr('href');        if (links.indexOf(link) === -1) {          links.push(link);        }        //save scraped data in object        sites.links = links;      });      // returns list of {url:'url', links:[link1,link2,link3]}      console.log(sites);    }  } catch (err) {    console.log(`Error fetching and parsing data: `, err);  }};
查看完整描述

1 回答

?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

不要認為這是一個與 Promise 相關的問題。


您需要將您的數據收集sites到一個在循環外部初始化的數組中。然后當getSubURLs()解析時,它將解析為您的數組:


const getSubURLs = async() => {

  let urls = await getURLS();

  let siteList = [];

  try {

    for (const url of urls) {

      //         :

      //         :

      //         :

      siteList.push(sites);

    }

  } catch (err) {

    console.log(`Error fetching and parsing data: `, err);

  }

  return siteList; // array of objects

};


getSubURLs().then(console.log);


查看完整回答
反對 回復 2023-11-02
  • 1 回答
  • 0 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號