Затем объявите переменную вне обещания, затем инициализируйте внутреннее обещание и получите доступ к внешнему обещанию - PullRequest
0 голосов
/ 06 марта 2019

Мне нужен доступ к outState var, который объявил класс outSide, а затем установил внутри getData() func в рамках обещания then() func.

внутри usrs func, когда цикл завершен, мне нужно получить к нему доступ, но я не могу.

let outState = {};
class A extends Component{
  getData(usr){
    db.collection('a/'+usr+'/bb').get().then(snap=>{
      for(i = snap.docs.length-1; i>=0; i--){
         outState[usr] = [...outState[usr], snap.docs[i].data()];
      }
    });
  }

  usrs(usrs){
    for(i = usrs.length-1; i>=0; i--){

       this.getData(usrs[i]);
       if(i===0){
        this.setState({ ...this.state, ...outState });
       }

    }
  }
}

Мне нужно обновить состояние за пределами цикла, в противном случае я могу установить состояние внутри функции обещания, но это замедляет работу моего приложения. Просто я хочу получить доступ к нему вне обещания, затем функции, а затем вне цикла обновить его.

1 Ответ

1 голос
/ 06 марта 2019

Я бы порекомендовал рефакторинг вашего компонента примерно так, чтобы все было чище:

class A extends Component{
  constructor() {
    super();
    this.state = {
      usersData: {}      
    }  
  }

  getData(usr){
      let dataForUser = {};
      db.collection('a/'+usr+'/bb').get().then(snap=>{
        for(i = snap.docs.length-1; i>=0; i--){
           dataForUser[usr] = [...dataForUser[usr], snap.docs[i].data()];
        }
      });
      return dataForUser;
    }

    usrs(usrs){
      let data = {};
      for(i = usrs.length-1; i>=0; i--){
         let userData = getData(usrs[i]);

         if(i===0){
          data = {...data, ...userData};
         }
      }
      this.setState({usersData: data});
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...