Получение данных из API и преобразование строк в числа - PullRequest
0 голосов
/ 05 августа 2020

У меня две проблемы. Во-первых, при загрузке данных из API я получаю их только по истечении заданного мной интервала. Однако первый звонок мне нужно получить немедленно. Во-вторых, когда я конвертирую полученные данные в числа, я теряю часть чисел, например, вместо получения 11 518,6217 я получаю только 11. Кто-нибудь может мне помочь, пожалуйста.

    class Currencies extends Component {
      state = {
        inputField: 0,
        exRates: 0,
      };
      componentDidMount() {
        try {
          setInterval(async () => {
            const res = await fetch(
              "https://api.coindesk.com/v1/bpi/currentprice.json"
            );
            const exRates = await res.json();
            console.log(exRates.bpi);
            this.setState({ exRates: exRates.bpi });
          }, 6000);
        } catch (err) {
          console.log(err);
        }
      }
      BTCChangeHandler = (event) => {
        this.setState({ inputField: event.target.value });
      };
      render() {
        const exRates = this.state.exRates;
        const currData = Object.values(exRates).map((value) => value.rate);
        const rates = currData.map(parseFloat);
        console.log(rates);
        return (
          <div>
            <input
              type="number"
              placeholder="Enter BTC value"
              onChange={this.BTCChangeHandler}
            />
            <Currency name="USD" value={this.state.inputField * rates[0]} />
            <Currency name="GPB" value={this.state.inputField * rates[1]} />
            <Currency name="EUR" value={this.state.inputField * rates[2]} />
          </div>
        );
      }
    }
    export default Currencies;

Ответы [ 3 ]

0 голосов
/ 05 августа 2020

Это проблема локали. Api предоставляет значения, в которых , обозначает тысячи и . обозначает десятичные дроби. Ваш клиент, вероятно, использует обратное. Сначала вам нужно будет преобразовать строку в локаль вашего клиента, а затем вы можете проанализировать ее как число.

Вы можете использовать библиотеку, такую ​​как упомянутая в этом сообщении . Или вы можете создать свою собственную функцию, которая переключает символы.

0 голосов
/ 05 августа 2020

вы можете попробовать setTimOut вместо setInterval , а затем вернуть обещание, которое извлекает данные в api rest

0 голосов
/ 05 августа 2020

Я использую setInterval, но при первом вызове мне нужно сразу его вызвать

Вы должны вызвать его вручную, а также вызвать его на setInterval.

let dofetch = async () => {
  const res = await fetch(
    "https://api.coindesk.com/v1/bpi/currentprice.json"
  );
  const exRates = await res.json();
  console.log(exRates.bpi);
  this.setState({ exRates: exRates.bpi });
}
setInterval(dofetch, 6000);
dofetch()

Я теряю часть чисел, например, вместо получения 11518,6217 я получаю только 11

Ваши строковые числа отформатированы как ,, вы должны удалить его перед их передачей в функцию parseFloat.

parseFloat('11,518.6217') // 11
parseFloat('11,518.6217'.split(',').join('')) // 11.518.6217

Поэтому измените:

currData.map(parseFloat);

на:

currData.map(s => parseFloat(s.split(',').join('')));
...