Javascript 如何在一个请求中等待另一个请求完成nodeJS中相同函数的执行

Javascript 如何在一个请求中等待另一个请求完成nodeJS中相同函数的执行,javascript,meteor,iron-router,Javascript,Meteor,Iron Router,我用的是流星。我在iron router中定义了一条路线,如下所示 Router.route('/api/generatereceptit',{where:'server'}).post(函数(req,res,next){ log(“API:generatereceipt已调用”); const reqBody=req.body; .... } 我希望一次生成一张收据。即,收据需要有一个唯一的编号,该编号本质上是递增的 现在我正在阅读以前存储的收据号并将其增加1。我认为这是当前处理收据的收据号

我用的是流星。我在iron router中定义了一条路线,如下所示

Router.route('/api/generatereceptit',{where:'server'}).post(函数(req,res,next){
log(“API:generatereceipt已调用”);
const reqBody=req.body;
....
}
我希望一次生成一张收据。即,收据需要有一个唯一的编号,该编号本质上是递增的

现在我正在阅读以前存储的收据号并将其增加1。我认为这是当前处理收据的收据号。

但是,只要多个客户端不同时调用
generatereceipt
API,这就可以正常工作。同时调用API时,所有同时处理的收据都会考虑相同的收据编号


因此,我想做一个请求检查,如果某个其他客户端在某个其他请求正在处理中时调用了相同的REST API。如果它正在处理中,那么我想等待它在该请求线程中的执行完成。

使用异步并等待一个请求的完成。

我假设这使用了某种数据se/后端来存储收据id?如果是这样,您应该在数据库上使用约束来确保收据id是唯一的。更好的是,为什么不使收据id列自动递增,那么您不需要检查以前的收据编号并自行递增,它将由数据库层处理,并作为收据的一部分返回e插入

如果不需要自动递增,那么只考虑使用uuID.< 我想不出任何一个你想等待执行的原因。这会使你的应用程序对于除第一个请求之外的任何人都变慢,并且不可扩展


如果您确实有合理的理由以这种方式构建它并自己生成自动增量,那么最好详细解释为什么会出现这种情况,因为可能有更好的解决方案,而只是“阻止”下一行,那么并发请求应该没有问题。请参阅以下示例:

从“Meteor/Meteor”导入{Meteor}
从“meteor/WebApp”导入{WebApp}
从“meteor/HTTP”导入{HTTP}
//创建一个简单的HTTP路由
使用('/api/generatereceptit',函数(req,res,next){
//随机0-50ms超时以模拟响应延迟
const randomTimeout=Math.floor(Math.random()*50)
//使用Meteor的Promise.await在非异步函数中等待异步
//-->应防止旧版iron路由器出现故障
const receive=Promise.await(getReceipt())
设置超时(()=>{
文书标题(200)
res.end(字符串(收据))
},随机超时)
})
//增量id并返回新值
让receiptId=0
异步函数getReceivement(){
返回接收ID++
}
Meteor.startup(函数(){
设testCount=0
常量url=Meteor.absoluteUrl('/api/generatereceipt')
//使用0的超时模拟并发调用
函数调用(id){
setTimeout(Meteor.bindEnvironment(()=>{
//模拟调用/api/generatereceipt路由
const response=HTTP.get(url)
console.log(id'=>',response.content)//应该匹配
}, 0))
}
for(设i=0;i<25;i++){
调用(testCount++)
}
})
如您所见,这些调用将解析为递增的ID:

流星服务器重新启动 I20200703-09:59:15.911(2)?9=>9 I20200703-09:59:15.912(2)?7=>7 I20200703-09:59:15.913(2)?4=>4 I20200703-09:59:15.913(2)?0=>0 I20200703-09:59:15.913(2)?21=>21 I20200703-09:59:15.913(2)?24=>24 I20200703-09:59:15.913(2)?17=>17 I20200703-09:59:15.913(2)?18=>18 I20200703-09:59:15.915(2)?2=>2 I20200703-09:59:15.917(2)?19=>19 I20200703-09:59:15.923(2)?6=>6 I20200703-09:59:15.923(2)?23=>23 I20200703-09:59:15.925(2)?11=>11 I20200703-09:59:15.928(2)?8=>8 I20200703-09:59:15.931(2)?16=>16 I20200703-09:59:15.932(2)?10=>10 I20200703-09:59:15.934(2)?5=>5 I20200703-09:59:15.934(2)?13=>13 I20200703-09:59:15.934(2)?22=>22 I20200703-09:59:15.936(2)?20=>20 I20200703-09:59:15.936(2)?15=>15 I20200703-09:59:15.939(2)?14=>14 I20200703-09:59:15.940(2)?1=>1 I20200703-09:59:15.940(2)?3=>3 I20200703-09:59:15.943(2)?12=>12
但async await仅在当前线程中工作。如何观察该API是否在其他线程上运行?还是在其他请求上运行?谢谢。我也在考虑这样做,但只是想我们是否可以检查另一个请求的执行情况。我将使用mongo的
$inc
或SimpleSchema的autoValue,将其设置为唯一字段。谢谢你。很高兴它被分类了,如果这个答案对你有帮助,请随意将它标记为已接受的答案。你给出的解决方案只有在同一个客户端发出并发请求时才有效。我的要求是从不同的请求中了解方法的执行情况。对于同一个客户端,我甚至可以使用Meteor的
this.unblock
作为方法这将允许并发执行方法。无论如何,感谢您展示了一种不同的并发请求方式。谢谢。
这一点。取消阻止
仅在使用DDP连接客户端的Meteor方法中有效,而iron路由器路由基于HTTP,并且没有可用的
取消阻止
。也没有真正的并发,因为节点服务器仍然是单线程的,所有传入的请求仍然在一个线程中处理。我的印象是,您产生了多个进程,并且遇到了每个进程都有自己的计数器的问题。在这种情况下,您将不得不依赖Mongo集合来持久化计数器。哦……是的,我从未考虑过我在铁路由器中。
解锁
仅在Meteor方法中有效。正如你所说,我们需要依赖mongo col