Nano Hash - криптовалюты, майнинг, программирование

Множественные запросы на выборку с setState в React и круговой диаграмме

Выполнение моего запроса занимало более 2 минут, и с этого момента в браузере истекло время ожидания. Итак, теперь я сломал запрос и теперь работаю как отдельный API, что полезно, но теперь я не знаю, как обрабатывать эти три запроса, чтобы он мог отображать данные.

Примечание. Данные API сохраняются в компоненте «Состояние» реакции, здесь это «Данные».

Теперь у меня есть логика, но может ли кто-нибудь дать мне направление, как ее реализовать.

Логика: перед сохранением результата API непосредственно в компоненте состояния мы можем сохранить его в другом массиве, затем мы можем выполнить итерацию по этому массиву для использования круговой диаграммы, после чего эти данные могут быть сохранены в компоненте состояния, который можно использовать для рендеринга. круговая диаграмма в функции «Отрисовка».

Здесь я делаю три разных вызова API одновременно и сохраняю их, здесь результат API напрямую сохраняется в компоненте состояния:

componentDidMount() {
    Promise.all([
      fetch("http://localhost:4000/api/EMEA/E_claimQuarter"),
      fetch("http://localhost:4000/api/EMEA/E_claimQuarter1"),
      fetch("http://localhost:4000/api/EMEA/E_claimQuarter2")
    ])
      .then(([res1, res2, res3]) => 

      Promise.all([res1.json(), res2.json(), res3.json()]))

      .then(([data1, data2, data3]) => 

        this.setState({
          // Data: data1, data2, data3,
          Data: {
            labels: [
              "FY19 Q1[NOV-JAN]",
              "FY19 Q2[FEB-APR]",
              "FY18 Q3[SEP-NOV]"
            ],
            datasets: [
              {
                label: "",
                data: data1,
                backgroundColor: [
                  "rgba(255,105,145,0.6)",
                  "rgba(155,100,210,0.6)",
                  "rgb(63, 191, 191)"
                ]
              }
            ]
          }
        })
      );
  }

Вот как вы обрабатываете API формы данных и проходите через него, а затем визуализируете эти данные для различных диаграмм, которые в моем случае представляют собой круговую диаграмму:

ComponentDidMount() {
    axios.get(`http://localhost:4000/api/APJ/A_claimQuarter`)
***************************************************************
    .then(res => {
          const claims = res.data;
          let claim = [];

          claims.forEach(element => {
            claim.push(element.CNT1);

          });
********************************************************************
          this.setState({ 
            Data: {
              labels: ['FY19 Q1[NOV-JAN]','FY19 Q2[FEB-APR]','FY18[SEP-NOV]'],
              datasets:[
                 {
                    label:'',
                    data: claim ,

                    backgroundColor:[
                     'rgba(255,105,145,0.6)',
                     'rgba(155,100,210,0.6)',
                     'rgb(63, 191, 191)'

                  ]
                 }
              ]
           }
           });
       })
}

  • Похоже, вы догадались. С какой проблемой вы столкнулись? 10.06.2019
  • Смотрите, я также выделил код, который я хочу реализовать в коде Promise.all, но я не знаю, как это сделать, вот в чем проблема. 10.06.2019
  • Потому что я не знаю, как обрабатывать запрос от трех разных API для рендеринга круговой диаграммы. 10.06.2019
  • не могу понять ur questio .. наверное стоит перефразировать .. 10.06.2019
  • Что вы не могли понять, можете ли вы мне правильно сказать? 10.06.2019

Ответы:


1

Я внес некоторые изменения, и теперь он отлично работает для меня, если кому-то нужен ответ, вы можете посмотреть мой, он на 100% работает:

  constructor(props) {
    super(props);

    this.state = {
      Data: []
    };
  }

  componentDidMount() {
    Promise.all([
      fetch("http://localhost:4000/api/EMEA/E_claimQuarter"),
      fetch("http://localhost:4000/api/EMEA/E_claimQuarter1"),
      fetch("http://localhost:4000/api/EMEA/E_claimQuarter2")
    ])
      .then(([res1, res2, res3]) => Promise.all([res1.json(), res2.json(), res3.json()]))
      .then(([data1, data2, data3]) => 
       { 
        console.log(typeof(data1));

        const array = [...data1, ...data2, ...data3];
        // const A = JSON.strigify(array);
        console.log('hi');
        console.log(array);
        console.log(data1);
        // console.log(A);
        let claim = [];

        array.forEach(element => {
        claim.push(element.COUNT);
        });
        console.log(claim);
        this.setState({
          // Data: data1, data2, data3,
          Data: {
            labels: [
              "FY19 Q1[NOV-JAN]",
              "FY19 Q2[FEB-APR]",
              "FY18 Q3[SEP-NOV]"
            ],
            datasets: [
              {
                label: "",
                data: claim,
                backgroundColor: [
                  "rgba(255,105,145,0.6)",
                  "rgba(155,100,210,0.6)",
                  "rgb(63, 191, 191)"
                ]
              }
            ]
          }
        })
       });
  }
11.06.2019
  • Я считаю, что вам следует искать решение, основанное на данных, т.е. не жестко запрограммированное на три четверти. Скажем, однажды вы захотите построить график из четырех кварталов, не лучше ли иметь обобщенную функцию, которая могла бы обрабатывать любое количество кварталов? Писать было бы несложно. 11.06.2019
  • Спасибо за внимание @Roamer, сейчас проект находится только в режиме прототипа, как только он будет полностью проработан в производственном режиме, я буду оптимизировать проект еще больше. 11.06.2019
  • Я заменил свой ответ чем-то, основанным на вашем собственном ответе. 11.06.2019
  • Потому что я новичок во всей этой веб-разработке 11.06.2019
  • Поймите - у вас все хорошо. 11.06.2019

  • 2

    Основываясь на собственном ответе OP, вот более общее решение:

    componentDidMount(graphData) {
        return Promise.all(graphData.map(dataObj => dataObj.url))
        .then(results => Promise.all(results.map(res => res.json())))
        .then(results => this.setState({
            'Data': {
                'labels': graphData.map(dataObj => dataObj.label),
                'datasets': [
                    {
                        'label': '',
                        'data': results.reduce((prev, next) => prev.concat(next), []),
                        'backgroundColor': graphData.map(dataObj => dataObj.bgColor)
                    }
                ]
            }
        }));
    }
    

    Как видите, методы массива .map() и .reduce() создают приятный компактный код.

    Звоните следующим образом:

    var quartersData = [
        { 'url':'http://localhost:4000/api/EMEA/E_claimQuarter', 'label':'FY19 Q1[NOV-JAN]', 'bgColor':'rgba(255,105,145,0.6)' },
        { 'url':'http://localhost:4000/api/EMEA/E_claimQuarter1', 'label':'FY19 Q2[FEB-APR]', 'bgColor':'rgba(155,100,210,0.6)' },
        { 'url':'http://localhost:4000/api/EMEA/E_claimQuarter2', 'label':'FY18 Q3[SEP-NOV]', 'bgColor':'rgb(63, 191, 191)' }
    ];
    
    componentDidMount(quartersData)
    .then(() => {
        console.log('complete');
    });
    
    11.06.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..