Как правильно вернуть значение из данных внутри функции - PullRequest
0 голосов
/ 07 июня 2018

Я новичок в javascript и начал изучать удивительные вещи из него.Как код ниже, как я могу вернуть значение index внутри getData().then(data => {.getData функция имеет значения ответа json.

subPatternStart() {
  getData().then(data => {
    var patternStart = 1525750500000;
    var index = 0;

    for (var i = 0; i < data.length; i++) {
      if ( patternStart >= data[i].time && patternStart < data[i+1].time ) {
        //...somecode
      }
    }
    console.log("Index:" , index);
  })
}

Чего я хочу добиться, так это того, чтобы при вызове этой функции я получал ТОЛЬКО значение индекса, которое в этом случае консольное значение журнала эквивалентно1.

У меня есть это в моем методе рендеринга.

render() {
  index={this.subPatternStart()}
}

В этом простом коде он возвращает точное значение в методе рендеринга, и я хочу сделать что-то вроде этого.

subPatternStart() {
  var patternStart = 1;
  return patternStart;
}

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

функция subPatternStart вызывает асинхронную функцию getData, поэтому вам нужно использовать либо callback, либо promises для получения данных в ответ.

1.Использование обратных вызовов

subPatternStart(callbackFunction) {
        getData().then(data => {
            var patternStart = 1525750500000;
            var index = 0;

            for (var i = 0; i < data.length; i++) {
                if (patternStart >= data[i].time && patternStart < data[i + 1].time) {
                    //...somecode
                }
            }
            console.log("Index:", index);
            callbackFunction(index);
        })
    }

// calling the function
render() {
    var index;
    this.subPatternStart((i) => { index = i })
}

2.Использование обещаний

subPatternStart(callbackFunction) {
    var promise = new Promise(resolve => {
        getData().then(data => {
            var patternStart = 1525750500000;
            var index = 0;

            for (var i = 0; i < data.length; i++) {
                if (patternStart >= data[i].time && patternStart < data[i + 1].time) {
                    //...somecode
                }
            }
            console.log("Index:", index);
            resolve(index);
        })
    })
    return promise;
}


// calling the function
async render() {
    index = await this.subPatternStart();
}
0 голосов
/ 07 июня 2018

После console.log () в функции subPatternStart вернуть все, что вы хотите, чтобы индекс получал.

0 голосов
/ 07 июня 2018

Вы должны установить состояние компонента со значением, которое вы получите от getData.Затем React может обновить его самостоятельно и отобразить страницу.Например

import React from 'react';

class App extends React.Component {

  constructor(props) {
    super(props);

    this.state = {
      index: 0
    }
  }

  subPatternStart() {
    getData().then(data => {
      var patternStart = 1525750500000;
      var index = 0;

      for (var i = 0; i < data.length; i++) {
        if (patternStart >= data[i].time && patternStart < data[i + 1].time) {
          //...somecode
        }
      }
      this.setState({
        index: index
      });
    })
  }
  render() {
    index =  this.state.index
  }
}
...