Я делаю вызов извлечения в 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 в конструктор обещаний без удачи (сделайте это для других операций с БД в этом приложении, и это работает).