一般节点.js/javascript问题和事件循环

General node.js/javascript question and event loop

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

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. findSimilarOne
  2. insertListingOne(如果 findSimilarOne return 不匹配)
  3. findSimilarTwo
  4. insertListingTwo(如果 findSimilarTwo return 不匹配)

这些操作顺序的唯一限制是#1 必须在#2 之前发生,而#3 必须在#4 之前发生。

这些完成的顺序是:#1、#3、#2、#4

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

你应该使用 async,像这样:

let test = async () => {
  await storeListing({ buildingType:'MFH' });
  await storeListing({ buildingType:'MFH' });
};

这对操作顺序实施了新的限制:#2 必须在#3 之前出现