getAllData не включает в себя только что вставленный элемент, даже после обратного вызова
Поэтому я использую NeDB в качестве хранилища данных для простого небольшого проекта, и я хочу создать небольшой API, который вставляет что-то новое и возвращает список всех элементов в хранилище данных, включая новый.
async function willAddNewItem() {
// db is NeDB Datastore
const existing = db.getAllData();
const sortedIds = existing
.map(item => item.id)
.sort((one, another) => one - another);
const id = sortedIds.length === 0
? 0
: sortedIds.slice(-1)[0] + 1;
const newItem = { id, foo: 'bar' };
await new Promise(resolve => db.insert(newItem, () => resolve()));
return db.getAllData()
.sort((one, another) =>
new Date(one.updatedAt).getTime() - new Date(another.updatedAt).getTime()
);
}
Однако каждый раз, когда я вызываю эту функцию, я получаю список элементов, которые у меня были до того, как вставить новую. При следующем вызове будет добавлен элемент, который я добавил в прошлый раз, но не новый. Обновление моей страницы (что приводит к вызову db.getAllData()
снова заполнить начальную страницу) показывает все, что должен. Это пропало только сразу после того, как я вставил его. Таким образом, казалось бы, что обратный вызов на db.insert
на самом деле не ждет, пока вставка завершится (и нет никакой документации, которую я могу найти по этому поводу).
Добавление индекса в id
исправляет это, и я хочу индекс на id
так что это хорошо, но я все еще хочу знать, почему это происходит / где я должен быть осторожен, чтобы это произошло в будущем. В этом отношении я немного обеспокоен тем, что единственная причина добавления индекса в id
работал, потому что это случилось немного быстрее, так что это было сделано, прежде чем я позвонил db.getAllData()
когда это не было раньше - и что это не может быть последовательным.
Я мог бы использовать что-то вроде
const afterAdding = await new Promise(resolve =>
db.insert(newItem, (_, newDoc) => resolve([...existing, newDoc]))
);
и вернуть отсортированный afterAdding
, но это кажется мне немного сомнительным (я действительно хотел бы получить именно состояние БД, а не пытаться "воссоздать" его сам, предполагая, что insert
сделал точно и только то, что я ожидал), и в любом случае я хотел бы узнать больше о том, как работает NeDB здесь.
Кроме того, да, я знаю, что игнорирую возможные ошибки на вставке (я проверил, является ли это причиной; это не так), и я, вероятно, не хочу .getAllData()
на всех, а некоторые .find
запрос. Это базовый тестовый пример, так как я знакомлюсь с NeDB.