React Meteor Как выполнить функцию после получения данных withTracker? - PullRequest
0 голосов
/ 05 июля 2018

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

    export default withTracker(() => {
     let towndatasub = Meteor.subscribe("userTownDataPublisher",Meteor.userId());
  let resourcedatasub = Meteor.subscribe("userResourcePublisher",Meteor.userId());

      return{
    townData : Towns.find({"ownerId":Meteor.userId()}).fetch(),
    resourceData : Resources.find({"ownerId":Meteor.userId()}).fetch()

      }

    })(TownPage);

Проблема заключается в том, что я хотел бы запустить функцию, когда поступают townData и resourceData. Если я вызываю updateResources в componentDidMount, я получаю неопределенное для реквизитов this.props.componentWillReceive, не вызываемых .townData и this.props.resourceData

updateResources = () =>{



Meteor.call("updateUserResources",Meteor.userId(),(err,result)=>{
if(err){
  console.log(err)
}else{
  console.log("asdasd");

      //console.log(this.props.resourceData); undefined
      // here i will do something with this.props.resourceData

}

})
      }

Так, где я должен вызвать функцию updateResources, чтобы не быть неопределенным?

1 Ответ

0 голосов
/ 05 июля 2018

Во-первых, componentDidMount вызывается только один раз при загрузке страницы, сразу после завершения первого вызова render. Поэтому вам не следует вызывать updateResources, так как есть вероятность, что коллекции к тому времени не закончили загрузку с сервера. Я бы порекомендовал позвонить по номеру render, потому что render будет вызываться один раз до прибытия данных и еще раз после получения данных.

Во-вторых, если вы хотите быть еще более точным с моментом поступления данных, вы можете вернуть еще два свойства в withTracker, включая функцию ready, например:

export default withTracker(() => {
    let towndatasub = Meteor.subscribe("userTownDataPublisher",Meteor.userId());
    let resourcedatasub = Meteor.subscribe("userResourcePublisher",Meteor.userId());

    return{
        townData : Towns.find({"ownerId":Meteor.userId()}).fetch(),
        resourceData : Resources.find({"ownerId":Meteor.userId()}).fetch(),
        townsReady : towndatasub.ready(),
        resourcesReady : resourcedatasub.ready()
    }

})(TownPage);

А затем при рендеринге вы можете вызывать updateResources только после получения данных,

if(this.props.townsReady && this.props.resourcesReady) {
    this.updateResources();
}
...