一般节点.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 操作排队:
- findSimilarOne
- insertListingOne(如果 findSimilarOne return 不匹配)
- findSimilarTwo
- 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 之前出现
我有以下问题: 我让两个函数写入我的数据库。在将它们插入数据库之前,我检查是否存在类似的项目:
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 操作排队:
- findSimilarOne
- insertListingOne(如果 findSimilarOne return 不匹配)
- findSimilarTwo
- 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 之前出现