DexieJS возвращает NotFoundError во вложенном запросе

Я столкнулся с проблемой на DexieJS, когда у меня был вложенный запрос. Ниже приведен пример моего кода: -

    let id = 1;

    let child = db.child.where({ id : result.child_id }).first( item => item ).catch( e => "NotFoundError"; );
    console.log(child); // success, it shows the child item

db.parent.where({ id : id }).each( parent => {
  let child = db.child.where({ id : parent.id }).first( item => item ).catch( e => "NotFoundError"; );
  console.log(child); // it will show NotFoundError
});

понятия не имею, что происходит, не работает ли вложенный запрос на DexieJS, который, я не сомневаюсь, должен работать.

Помогите советом, заранее спасибо.


person Sean Kiong    schedule 10.08.2020    source источник


Ответы (1)


Нашел решение или обходной путь, теперь работает.

await db.transaction('r', db.parent, db.child, async () => {
  await db.parent.where({ id : id }).each( async parent => {
    let child = db.child.where({ parent_id : parent.id }).first( result => result );
    console.log(child) // *now it shows the child record
  });
});

Похоже, нам нужно использовать транзакцию, чтобы получить запрос в результате запроса. Я надеюсь, что это правильный путь, и надеюсь, что это поможет. Пожалуйста, не стесняйтесь комментировать, если это не так.

Наместе.

person Sean Kiong    schedule 10.08.2020
comment
Это нормальное решение. Причина, по которой вам это нужно, заключается в том, что каждый() запускает свой обратный вызов в неявной транзакции только для чтения, содержащей только db.parent. На самом деле происходит то, что db.child не является частью транзакции. Однако я бы рекомендовал использовать toArray() вместо each() для простоты и производительности. См. dexie.org/docs/Collection/Collection.each()#notes - person David Fahlander; 10.08.2020
comment
@DavidFahlander Спасибо за совет, он работает и должен быть лучше. Я думаю, что меня все еще ломает следующий код, который не возвращает результат. console.log(db.table.where({id:id}).first(result =›result); он всегда возвращает De {_listener ........ как я могу получить объект в результате? спасибо заблаговременно - person Sean Kiong; 10.08.2020
comment
То, что вы передаете в console.log(), является обещанием. Вы должны подождать или изменить код на db.table.where({id: id}).first(result => console.log(result)) - person David Fahlander; 11.08.2020