繁体   English   中英

如何将异步 function 返回的 object 分配给变量

[英]How to assign an object returned by an async function to a variable

我有一个 function 从网站上抓取数据。 function 是这样的:

  const getSharesInfo = async () => {
      try {
        const { data } = await axios.get(url);
        const $ = cheerio.load(data);
        const elmSelector =
          "#ctl00_ContentPlaceHolder1_LiveTrading > table > tbody > tr";
        const keys = [
          "Name",
          "LTP",
          "% Change",
          "Open",
          "High",
          "Low",
          "Qty",
          "Close Price",
        ];
        $(elmSelector).each((parentIdx, parentElm) => {
          let keyIdx = 0;
          const sharesObj = {};
          $(parentElm)
            .children()
            .each((childIdx, childElm) => {
              const tdValue = $(childElm).text();
              if (tdValue) {
                sharesObj[keys[keyIdx]] = tdValue;
                keyIdx++;
              }
            });
          console.log(sharesObj);
          return sharesObj;
        });
      } catch (err) {
        console.error(err);
      }
    };

它从抓取的数据中生成一个 object。 然后当我运行 function 它控制台记录 shareObj 和 output 是这样的:

{
  Name: 'USLB',
  LTP: '890.00',
  '% Change': '0.79',
  Open: '890.00',
  High: '888.10',
  Low: '888.10',
  Qty: '24'
}
{
  Name: 'VLBS',
  LTP: '849.00',
  '% Change': '0',
  Open: '850.00',
  High: '833.00',
  Low: '834.00',
  Qty: '285'
}
{
  Name: 'WNLB',
  LTP: '927.30',
  '% Change': '-4.4',
  Open: '965.00',
  High: '927.30',
  Low: '965.00',
  Qty: '270'
}

我想抓住它并将它传递给家庭路线。 我有这样的设置路由器。

app.get("/", async (req, res) => {
  const shares = await getSharesInfo();
  res.render("home", { shares });
});

但是当我控制日志共享时,我什么也得不到。 没有错误没有数据什么都没有。 它只是打印一些空白区域。 我该如何解决这个问题??

const sharesObj = {}声明移到对.each的调用之外(=向上移动 3 行)并移动行return sharesObj; 也离开.each循环(例如:将其向下移动两行)。

截至目前,您.each中创建常量绑定,然后在.each回调中返回它,而不是在getSharesInfo中。

例子:

  const getSharesInfo = async () => {
  try {
    const { data } = await axios.get(url);
    const $ = cheerio.load(data);
    const elmSelector =
      "#ctl00_ContentPlaceHolder1_LiveTrading > table > tbody > tr";
    const keys = [
      "Name",
      "LTP",
      "% Change",
      "Open",
      "High",
      "Low",
      "Qty",
      "Close Price",
    ];
    const sharesObj = {}; // <-- new position
    $(elmSelector).each((parentIdx, parentElm) => {
      let keyIdx = 0;
      //const sharesObj = {}; <-- old position
      $(parentElm)
        .children()
        .each((childIdx, childElm) => {
          const tdValue = $(childElm).text();
          if (tdValue) {
            sharesObj[keys[keyIdx]] = tdValue;
            keyIdx++;
          }
        });
      console.log(sharesObj);
      //return sharesObj; <-- old position
    });
    return sharesObj; // <-- new position
  } catch (err) {
    console.error(err);
  }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM