Почему бы не отреагировать, дождавшись, пока мой вызов извлечения не закончится sh? - PullRequest
0 голосов
/ 30 марта 2020

Я делаю вызов извлечения в componentDidMount компонента, чтобы обновить модель веб-приложения (информация профиля). При первом рендере или ссылке sh модель пуста. Если я переключаюсь на другую сцену, то возвращаюсь, модель работает как положено.

Модель Tutorstore - это просто экспорт, содержащий данные и методы для работы с этими данными. Он передается через реквизит любому компоненту, который должен с ним работать. Вызовом выборки является метод Tutorstore.Fetch.

Компонент, выполняющий вызов

componentDidMount = async () => {
      let tID = sessionStorage.getItem("Tutor");
      await this.props.tutorStore.Fetch(tID);
      let qDB = new PouchDB(
        "https://b705ce6d-2856-466b-b76e-7ebd39bf5225-bluemix.cloudant.com/programs"
      );
      qDB
        .changes({ since: "now", live: true, include_docs: true })
        .on("change", () => {
          this.props.tutorStore.Fetch(tID);
        });

      console.log(this.props.tutorStore.Tutor._id);
    };

Экспорт модели

export let TutorStore = observable({
  Tutor: {},
  Queue: [],
  QLength: null
});

Фактический метод выборки в модели

TutorStore.Fetch = id => {
  var db = new PouchDB(
    "https://b705ce6d-2856-466b-b76e-7ebd39bf5225-bluemix.cloudant.com/tutors"
  );
  var qDB = new PouchDB(
    "https://b705ce6d-2856-466b-b76e-7ebd39bf5225-bluemix.cloudant.com/programs"
  );

  db.get(id)
    .then(function(doc) {
      if (!doc.isLoggedIn) {
        doc.isLoggedIn = true;
        db.put(doc);
      }
      TutorStore.Tutor = doc;
      console.log(TutorStore.Tutor);
    })
    .then(() => {
      qDB.get(TutorStore.Tutor.programID).then(function(doc) {
        TutorStore.Queue = doc.activeQ;
        TutorStore.QLength = doc.qLength;
      });
    })
    .catch(function(err) {
      console.log(err);
    });
};

Цепочка опор существует, проблем нет. Журнал консоли модели показывает, что вызов выборки сработал и обновил модель, но он не отображается в компоненте.

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

Я попытался поместить вызов функции fetch в конструктор обещаний без удачи (сделайте это для других операций с БД в этом приложении, и это работает).

...