常规node.js / javascript问题和事件循环

问题描述 投票:0回答:1

我有以下问题:我让两个函数写入我的数据库。在将它们插入数据库之前,我检查是否存在类似的项目:

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];
}
javascript node.js elasticsearch event-loop
1个回答
1
投票

即使插入顺序不相关,您仍然需要使用await以避免竞争情况。

您的完整代码将以下I / O操作排队:

  1. findSimilarOne
  2. insertListingOne(如果findSimilarOne不返回匹配项)
  3. findSimilarTwo
  4. insertListingTwo(如果findSimilarTwo返回不匹配)

这些操作的唯一条件是#1在#2之前发生,而#3在#4之前发生。

这些几乎完成的顺序是:#1,#3,#2,#4

因为两个findSimilar调用都在一个insertListing完成之前完成,所以它们都不返回匹配项。

© www.soinside.com 2019 - 2024. All rights reserved.