我有以下问题:我让两个函数写入我的数据库。在将它们插入数据库之前,我检查是否存在类似的项目:
const storeListing = async listing => {
//Some logic
const foundSimilar = await findSimilar(listing);
if(!foundSimilar){
await insertListing(listing)
}else{
//Perform duplicate check
if(foundSimilar.buildingType===listing.buildingType){
console.log('found')
}
}
}
现在执行以下操作:
const test = () => {
storeListing({buildingType:'MFH'});
storeListing({buildingType:'MFH'});
}
永远不会触发带有重复检查的else条件。
我的想法是,这两个函数按顺序进行处理(事件循环)。因此,在完成一项操作之前,不能再次调用storeListing。
所以我在这里有逻辑上的问题,还是仅仅是数据库最终具有一致性?
编辑:当我不知道还有多少个其他函数调用storeListing并希望将其序列化时(例如,我有多户住宅的storeListing-单户住宅的商店清单)。
这是一个好模式吗?
const lock={};
export const storeListing = async (listing, type) => {
const id= uuidv1();
while (Object.keys(lock).length>0){
await timeout(15);
}
threadLock[id]=true;
//Function like above
delete lock[id];
}
即使插入顺序不相关,您仍然需要使用await
以避免竞争情况。
您的完整代码将以下I / O操作排队:
这些操作的唯一条件是#1在#2之前发生,而#3在#4之前发生。
这些几乎完成的顺序是:#1,#3,#2,#4
因为两个findSimilar
调用都在一个insertListing
完成之前完成,所以它们都不返回匹配项。