【问题标题】:Wait for the variables to fully load in javascript等待变量在 javascript 中完全加载
【发布时间】:2020-11-06 20:41:51
【问题描述】:

代码是关于什么的?

以下是我的应用程序中的代码块,其中代码到达网络并获取网站的 HTML 数据以进行 scraping。我使用https://cors-anywhere.herokuapp.com 获取 HTML 数据,并使用 Cheerio 从 HTML 块中抓取所需数据。

import axios from "axios";
import cheerio from "cheerio";
import {
  getJobTitle,
  getOrgImage,
  getOrgName,
  paginate,
  getLocation
} from "./Helpers";

let jobTitles = [];
let imgs = [];
let orgsNames = [];
let locations = [];
let forState = [];
let bucket = [];

const state = {
  jobs: []
};

const getters = {
  meroJobs: state => state.jobs
};

async function getFromNextPage(status) {
  if (status !== null) {
    let res = await axios.get(
      "https://cors-anywhere.herokuapp.com/https://examle.com" + status
    );
    let chunk = cheerio.load(res.data);
    callHelpers(chunk);
  }
  return;
}

const callHelpers = html => {
  if (html !== null) {
    jobTitles = jobTitles.concat(getJobTitle(html));
    imgs = imgs.concat(getOrgImage(html));

    orgsNames = orgsNames.concat(getOrgName(html));

    locations = locations.concat(getLocation(html));

    let status = paginate(html);

    getFromNextPage(status);
    forState = makeObject(jobTitles, imgs, orgsNames, locations);
    bucket = bucket.concat(forState);

    console.log(bucket.length);
  }
  return;
};

const makeObject = (jobs, img, org, locations) => {
  let mjobs = [];
  for (let i = 0; i < jobs.length; i++) {
    mjobs.push({
      title: jobs[i],
      img: "https://example.com" + img[i],
      org: org[i],
      location: locations[i]
    });
  }
  return mjobs;
};

const actions = {
  async fetchByQuery({
    commit
  }, param) {
    console.log("clicked");
    console.log(param);
    let response = await axios.get(
      "https://cors-anywhere.herokuapp.com/https://example.com/search/?q=" +
      param
    );
    console.log("Response got");
    let html = cheerio.load(response.data);

    callHelpers(html);

    commit("setMeroJobs", bucket);
  }
};

const mutations = {
  setMeroJobs: (state, jobs) => (state.jobs = jobs)
};

export default {
  state,
  getters,
  actions,
  mutations
};

这段代码有效吗?

是的,代码运行良好。它确实会获取 HTML 数据并抓取所需的数据。

那是什么问题?

在上面的代码块中,我们可以看到我正在将变量bucket 的数据加载到要在前端显示的状态。变量bucket 本身在被多次调用的callHelpers 方法的if 语句中获取数据。

虽然我已经制作了一种方法来检查分页并从每个页面获取数据并将数据加载到变量bucket。但是我只从第一次调用/迭代中获取数据[仅来自第一页的数据]。

如何等到所有数据都加载到bucket 中才能在前端显示。

您有有效的链接吗?

我正在本地机器上运行应用程序,但这是codesandbox中我的应用程序的副本

输入teacher无分页1页4条数据manager分页3页18条数据

【问题讨论】:

  • callHelpers() 内部是代码中唯一知道变量设置正确的地方。因此,您要么从那里使用它们,要么将其余代码包装在一个函数中并从那里调用该函数。这就是异步代码在 Javascript 中的工作方式。您必须在与完成异步操作相关的回调内或从那里调用的某个函数内使用异步调用的结果。没有其他方法可以解决这个问题。
  • 如果你想多次调用getFromNextPage(),那么你需要跟踪你何时完成了数据的积累,并从最后一次的完成回调中开始你的最终操作。调用它,您需要知道所有这些都已完成。这需要正确设计您的代码以进行排序。

标签: javascript node.js vue.js vuejs2


【解决方案1】:

问题在于fetchByQuery 中的callHelpers - 您只需调用一次并确保之后提交存储桶。

在我看到的解决这个问题的许多方法之一是更新你的代码,它应该等到callHelpers 完成它的工作,然后提交bucket

请注意,我所说的callHelpers 工作是指遍历所有页面并填充所有数据。

https://codesandbox.io/s/reverent-butterfly-vs9ek?file=/src/store/modules/MeroJob.js

【讨论】:

  • 搜索两个参数 teacherreact 而不刷新应用程序会显示两个搜索的结果。我确实放置了`state.jobs.length = 0; bucket.length = 0;` 和 state.jobs=[ ]; bucket = [ ]fetchByQuery 方法中的 axios 请求之前但没有帮助。我是否需要声明另一个行动并为此设置突变??
  • @PawanRai 如果您不想继续连接结果,可以在搜索调用开始时清空bucket
  • 我在搜索开始时确实清空了,但它根本不起作用。您可以查看上述问题中的链接。
  • @PawanRai 因为构成bucket 内容的所有引用仍然存在。例如。 jobTitlesimgsorgNames 等 - 你也需要重置它们。再次检查您的代码示例,在那里我提供了您自己的reset()
猜你喜欢
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 2020-11-29
  • 2015-08-31
  • 2016-10-17
  • 2013-10-31
  • 2019-02-10
相关资源
最近更新 更多