Проблема возникает из-за того, что получение данных из бд происходит медленно, без async\await получается, что чтение из бд слишком медленное.
В componentWillMount() вылезает ошибка Cannot read property 'find' of undefined, потому что getfieldsets() не успевает отработать к этому времени (как я понимаю)
async function fieldsetsWork(){
//объявление переменных
var k=0;
var string = '';
var def = getFields().map((it,i)=>({
name:it.name,
hidden: false,}));
var stringDef ='';
for (var i=0;i<def.length;i++){
stringDef = stringDef + def[i].name;
}
// проверка на существование филдсетов пользователя
var pushDbUser = Dexie.async(function* (){
try {
var p = yield db.table('fieldsets').each(function(element){
if (element.f_Uname.includes(global.currentUser.value.login.toString())){
fieldsets_.push(element);
k++;
}});
yield p;
yield console.log('null',fieldsets_);
yield console.log(fieldsets_[0]);
} finally { return 0; }
})
await pushDbUser().catch(e => console.error(e));
// проверка версии
if (k !== 0){
for (var i=0;i<fieldsets_[0].data.length;i++){
string = string +fieldsets_[0].data[i].name; }
if (string == stringDef){ k = k;
}else k = 0;
};
await console.log(k);
// если нет филдсетов добавляем дефолтные
var pushFDB = Dexie.async(function* (){
try {
var p = yield db.table('fieldsets').each(element =>{
console.log(element)
if (element.f_Uname.includes('default')){
fieldsets_.push(element);
console.log(element);
}})
yield p;
yield console.log('null2',fieldsets_);
yield console.log(fieldsets_[0]);
yield console.log('0');
} finally { return 0; }
})
if (k===0){
await console.log('k=0')
await pushFDB().catch(e => console.error(e));
}
await localStorage.setItem('requirements_fieldsets', JSON.stringify(fieldsets_))
var p = await fieldsets_.forEach(fieldset=>
fieldset.data.forEach(field=> field.def = getFields().find(it=> it.name===field.name)));
fieldsets = p;
return fieldsets_;
}
fieldsetsWork();
export function getFieldsets(force){
if(force){
const fieldsets_ = fieldsetsWork(); //JSON.parse(localStorage.getItem('requirements_fieldsets'));
fieldsets_.forEach(fieldset=>
fieldset.data.forEach(field=> field.def = getFields().find(it=> it.name===field.name)));
fieldsets = fieldsets_
}
return fieldsets
}
componentWillMount(){
this.setState(old=>({
...old,
fieldset: getFieldsets().find(it=>it.favourite)
}));
}
getFieldsetsс параметромtrue? – Stepan Kasyanenko Dec 21 '18 at 13:23getFieldsetsвозвращаетfieldsets, которые присваиваются вfieldsetsWork(), я просто не знаю, как заставить остальную часть программы ждать, пока выполнитсяfieldsetsWork(), единственный вариант, который вижу, это записывать результат в state и перерендерить, когда результат придёт. – Ivan Burilichev Dec 22 '18 at 13:47await fieldsetsWork();тогда остальной код будет "ждать", пока не выполнитсяfieldsetsWork. – Stepan Kasyanenko Dec 24 '18 at 04:20