с анонимной функцией, которая получает результат и console.log, это работает.

ользуюПапа Парс проанализировать файл CSV для графиков. Я хочу хранить данные вРеагировать состояние после анализа файла. Papa.Parse () ничего не возвращает и результаты предоставляются асинхронно функции обратного вызова. Кроме того, setState () не работает внутри асинхронного обратного вызова. Этот вопрос похож наПолучение проанализированных данных из CSV.

Я попытался сохранить данные в состоянии, используя приведенный ниже код, но, как и ожидалось, это не сработало.

componentWillMount() {

    function getData(result) {
      console.log(result); //displays whole data
      this.setState({data: result}); //but gets error here
    }

    function parseData(callBack) {
      var csvFilePath = require("./datasets/Data.csv");
      var Papa = require("papaparse/papaparse.min.js");
      Papa.parse(csvFilePath, {
        header: true,
        download: true,
        skipEmptyLines: true,
        complete: function(results) {
          callBack(results.data);
        }
      });
    }

    parseData(getData);
}

Вот ошибка, которую я получаю, когда устанавливаю состояние внутри getData ().

Данные можно использовать внутри getData (), но я хочу их извлечь.

Как мне хранить данные в состоянии или в другой переменной, чтобы я мог использовать их для графиков?

 Amanshu Kataria20 окт. 2017 г., 15:21
@ Ларс вопрос обновлен.
 Larce20 окт. 2017 г., 15:14
Какое именно сообщение об ошибке вы получаете? (На this.setState ({data: result});)
 Staplerfahrer20 окт. 2017 г., 15:18
@ Amanshu: Я имел в виду: тема вашего поста должна быть вопросом. Переполнение стека основано на вопросах и ответах. Если ваше сообщение не озаглавлено вопросом, как может быть ответ на него? (См. Строку меню вверху: сначала в ней отображаются вопросы!)
 Amanshu Kataria20 окт. 2017 г., 15:14
@Jacob, пожалуйста, проверьте последнюю строку.
 Staplerfahrer20 окт. 2017 г., 15:09
Можете ли вы перефразировать вашу тему в вопрос, который легко читать и понимать? Ваш пост не содержит вопросов до последней строки, это не идеально.

Ответы на вопрос(1)

Решение Вопроса

Вы пытаетесь вызвать this.setState в функции getData. Но это не существует в контексте этой функции.

Решение:

Я бы постарался не писать функции в функциях, а писать функции в классе.

Ваш класс может выглядеть так:

import React, { Component } from 'react';

class DataParser extends Component {

  constructor(props) {
    // Call super class
    super(props);

    // Bind this to function updateData (This eliminates the error)
    this.updateData = this.updateData.bind(this);
  }

  componentWillMount() {

    // Your parse code, but not seperated in a function
    var csvFilePath = require("./datasets/Data.csv");
    var Papa = require("papaparse/papaparse.min.js");
    Papa.parse(csvFilePath, {
      header: true,
      download: true,
      skipEmptyLines: true,
      // Here this is also available. So we can call our custom class method
      complete: this.updateData
    });
  }

  updateData(result) {
    const data = result.data;
    // Here this is available and we can call this.setState (since it's binded in the constructor)
    this.setState({data: data}); // or shorter ES syntax: this.setState({ data });
  }

  render() {
    // Your render function
    return <div>Data</div>
  }
}

export default DataParser;
 Amanshu Kataria20 окт. 2017 г., 15:55
Это сработало отлично.
 SpicyClubSauce15 февр. 2018 г., 18:25
@ Ларс, эй, ребята, я пытаюсь воссоздать что-то вроде этого решения, но требование вызова не работает для меня ... какие-нибудь идеи?stackoverflow.com/questions/48800251/...
 KernelSanders04 июн. 2018 г., 17:05
@ Ларс, почему голыеthis.updateData работать как функция обратного вызова для завершения, ноthis.updateData(result) не работает? Если я заменюthis.updateData с анонимной функцией, которая получает результат и console.log, это работает.

Ваш ответ на вопрос