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.

0 ответов

Другие вопросы по тегам