javascript - 函数真的需要返回 promise 才能使 async-await 工作吗?
问题描述
我的疑问是,我可以编写一个普通函数并等待调用该函数。我会用一个例子更清楚地解释它考虑这个函数
let splitStringAndConvertToInt=(data)=>{
let splitData=data.split("-")
let bothValues={
first:parseInt(splitData[0]),
last:parseInt(splitData[1])
}
return bothValues
}
上面是我要调用的函数,下面是主函数
let allocateRoomAccordingToNeeds=async (request)=>{
let mode=request.mode
let totRooms=request.totalRooms
let firstYearBtech=await splitStringAndConvertToInt(request.firstYearBtech)
let secondYearBtech=await splitStringAndConvertToInt(request.secondYearBtech)
let thirdYearBtech=await splitStringAndConvertToInt(request.thirdYearBtech)
let fourthYearBtech=await splitStringAndConvertToInt(request.fourthYearBtech)
let firstYearMtech=await splitStringAndConvertToInt(request.firstYearMtech)
let secondYearMtech=await splitStringAndConvertToInt(request.secondYearMtech)
let others=await splitStringAndConvertToInt(request.others)
let tutors=await splitStringAndConvertToInt(request.tutors)
let staff=await splitStringAndConvertToInt(request.staff)
if (mode="Category" )
{
Room.updateMany({Room_number:{ $gte:firstYearBtech.first,$lte:firstYearBtech.last }}, {"$set":{"position": "1 year btech"}}, (err, writeResult) => {if(err){console.log("error in 1 btech"+err)} else{
Room.updateMany({Room_number:{ $gte:secondYearBtech.first,$lte:secondYearBtech.last }}, {"$set":{"position": "2 year btech"}}, (err2, writeResult2) => {if(err2){console.log("error in 2 btech"+err2)} else{
Room.updateMany({Room_number:{ $gte:thirdYearBtech.first,$lte:thirdYearBtech.last }}, {"$set":{"position": "3 year btech"}}, (err3, writeResult3) => {if(err3){console.log("error in 3 btech"+err3)} else{
Room.updateMany({Room_number:{ $gte:fourthYearBtech.first,$lte:fourthYearBtech.last }}, {"$set":{"position": "4 year btech"}}, (err4, writeResult4) => {if(err4){console.log("error in 4 b tech"+err4)} else{
Room.updateMany({Room_number:{ $gte:firstYearMtech.first,$lte:firstYearMtech.last }}, {"$set":{"position": "1 year mtech"}}, (err1m, writeResult1m) => {if(err1m){console.log("error in 1 mtech"+err1m)} else{
Room.updateMany({Room_number:{ $gte:secondYearMtech.first,$lte:secondYearMtech.last }}, {"$set":{"position": "2 year mtech"}}, (err2m, writeResult2m) => {if(err2m){console.log("error in 2 mtech"+err2m)} else{
Room.updateMany({Room_number:{ $gte:others.first,$lte:others.last }}, {"$set":{"position": "others"}}, (errO, writeResultO) =>{if(errO){console.log("error in others"+errO)} else{
Room.updateMany({Room_number:{ $gte:tutors.first,$lte:tutors.last }}, {"$set":{"position": "tutors"}}, (errT, writeResultT) => {if(errT){console.log("error in tutor"+errT)} else{
Room.updateMany({Room_number:{ $gte:staff.first,$lte:staff.last }}, {"$set":{"position": "staff"}}, (errS, writeResultS) => {
if(errS){
console.log("error in staff"+errS)
}
else{
console.log("Success allocation of Room")
res.send("Succes allocation of room")
}})
}})
}})
}})
}})
}})
}})
}})
}});
}
else if(mode="Custom" ){
Room.updateMany({"$set":{"position": "Custom"}}, (error, resultUp) => {
if(error){
console.log("error in Custom mode"+error)}
else{
console.log("successful upload of custom mode")
}})
}
}
以下是所有这些的根代码
router.post('/authentication/changeallocationmode', function(req, res, next){
//add code to assign same years to the given list if they are somewhere else and also add code to warn that given limit is not enough
let vacate=req.body.vacate
if(vacate==true){
Room.updateMany({$set:{Roommates:["Null","Null","Null"],Occupied:false,Allocated:false}})
.then(()=>{allocateRoomAccordingToNeeds(req.body)})
}
else {allocateRoomAccordingToNeeds(req.body)} /*this if-else is done to make it synchronous
so checking of vacate will be done and only after that other process will be done*/
});
正如您在调用splitToStringAndConvertToInt()后看到的那样 ,有一个 Room.updateMany() 查询,因此需要在查询之前调用 await 以确保正确同步,因为 node.js 是异步的。 所以我需要知道的是,我可以这样调用等待,而不返回承诺吗?
解决方案
是的,函数应该返回promise,或者函数本身使用async-await,那么你可以使用await,否则await将没有意义
但是你的函数不需要是 promise 或 async-await 因为它不需要时间来完成
推荐阅读
- c - Valgrind 不能在 MacOS Mojave 上运行?与康达一起安装
- python - 增加matplotlib图形xaxis的大小和间距
- acumatica - 我在 Acumatica 的通用查询中遇到问题,输入屏幕“此表单无法自动化”
- python - 远日期被转换为 datetime.datetime 对象而不是 datetime64[ns]
- javascript - 如何使用 Jquery 将类添加到附加元素?
- python - 从 0 重新启动 pandas 时间序列数据集时间戳
- php - Codeigniter - 无法从多个文件输入上传文件
- postgresql - TimescaleDB 中的索引
- javascript - 如何隐藏网络选项卡中的数据?
- powershell - foreach 中的 foreach(嵌套)