getAllData不包括刚刚插入的元素,即使在回调之后

时间:2018-12-06 14:51:25

标签: javascript asynchronous nedb

因此,我将NeDB用作一个简单的小项目的数据存储,我想创建一个小API,该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 个答案:

没有答案