Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript getAllData不包括刚插入的元素,即使在回调之后也是如此_Javascript_Asynchronous_Nedb - Fatal编程技术网

Javascript getAllData不包括刚插入的元素,即使在回调之后也是如此

Javascript getAllData不包括刚插入的元素,即使在回调之后也是如此,javascript,asynchronous,nedb,Javascript,Asynchronous,Nedb,因此,我使用NeDB作为一个简单小项目的数据存储,我想创建一个小API,它插入一些新内容并返回数据存储中所有项目的列表,包括新项目 异步函数willAddNewItem(){ //db是NeDB数据存储 const existing=db.getAllData(); const sortedis=现有 .map(item=>item.id) .sort((一个,另一个)=>一个-另一个); const id=sortedis.length==0 ? 0 :sorted.slice(-1)[0]+

因此,我使用NeDB作为一个简单小项目的数据存储,我想创建一个小API,它插入一些新内容并返回数据存储中所有项目的列表,包括新项目

异步函数willAddNewItem(){
//db是NeDB数据存储
const existing=db.getAllData();
const sortedis=现有
.map(item=>item.id)
.sort((一个,另一个)=>一个-另一个);
const id=sortedis.length==0
? 0
:sorted.slice(-1)[0]+1;
const newItem={id,foo:'bar'};
等待新的承诺(resolve=>db.insert(newItem,()=>resolve());
返回db.getAllData()
.sort((一个,另一个)=>
新日期(one.updatedAt.getTime()-新日期(另一个.updatedAt.getTime())
);
}
但是,每次调用此函数时,我都会得到插入新函数之前的项目列表。在下一次通话中,我上次添加的项目将在那里,但不是新项目。刷新我的页面(这将导致再次调用
db.getAllData()
来填充初始页面)显示它应该显示的所有内容。只有在我插入它之后,它才立即丢失。因此,
db.insert
上的回调似乎并没有真正等待插入完成(我也找不到任何相关文档)

id
中添加一个索引可以解决这个问题,我确实希望在
id
上添加一个索引,这样做很好,但我仍然想知道为什么会发生这种情况/我必须在未来注意的地方。就这一点而言,我有点担心,将索引添加到
id
中的唯一原因是因为它恰好快了一点,所以在我调用
db.getAllData()
之前,它是“完成”的,而这可能是不一致的

我可以用像这样的东西

const afterAdding=等待新承诺(解析=>
db.insert(newItem,(u,newDoc)=>resolve([…existing,newDoc]))
);
并在添加后返回排序后的
,但这对我来说似乎有点可疑(我真的很想准确地获取数据库的状态,而不是自己尝试“重新创建”它,假设
insert
完全按照我的预期完成了操作),无论如何,我想知道更多关于NeDB在这里是如何工作的


另外,是的,我知道我忽略了插入中可能出现的错误(我已经检查过这是否是原因;不是),我可能根本不想要
.getAllData()
,而是一些
。查找
查询。这是我熟悉NeDB的一个基本测试用例。

您是否尝试过检查
insert
上的回调是否存在错误?是不是只是没有插入新数据?@OliverRadini不,没有错误,在下一次通话中,我得到了包括第一个在内的列表,然后在第三次通话中,第二个在那里,依此类推。编辑以澄清这一点。我很难用您拥有的代码复制它,当我尝试时,函数返回所有数据,包括新添加的项。你能提供更多关于你所拥有的实现的细节吗?@OliverRadini除了一些响应API调用的基本样板文件外,还插入了一个稍大的对象(
id
,两个短字符串,一个空数组和一个数字),这与我所拥有的非常匹配。正如我在一篇编辑文章中所指出的,在
id
中添加一个索引可以解决问题,实际上,当我删除该索引时,我也无法重现问题。这让我想知道,当我尝试测试
wait
版本时,是否仅仅是构建snafu(我实际上使用的是Typescript)导致我仍然使用我的原始版本(它没有
wait
insert)。@OliverRadini感谢您花时间尝试复制,我真的很感激。不幸的是,除非我能自己复制它(假设它不是一个构建陷阱——我在监视模式下使用的是
tsc
,并且
nodemon
,而且它很挑剔),否则我怀疑这个问题可能会出现。更不幸的是,我想不出任何方法来确定这是一个构建问题。我确信返回到没有
await
的版本将无法工作,但这并不排除
await
版本存在一些奇怪的时间问题。。。