javascript - JavaScript 不等待来自端点的响应
问题描述
背景
这是客户端 Javascript,我在其中发出发布请求以使用表单参数更新相应的表。我的数据库有两个表——Rabbit 表和 MyStuff 表,MyStuff 表保存了 rabbit 表的外键。现在,我首先通过发布请求更新 Rabbit 表,该请求不仅更新 Rabbit 表,还更新服务器中rabbitID变量的值,第二个请求使用相应的表单参数更新 MyStuff,并使用rabbitID变量刚刚更新。
async function updateAllHelper(formDataParam) {
let updateR = await updateRabbitTable(formDataParam);
let updateMyS = await updateMyStable(formDataParam);
}
async function updateRabbitTable(formDataParam) {
let headers = new Headers();
const response = await fetch("/updateRtable", {
method: "POST",
body: formDataParam,
headers
});
const body = await response.json();
return body;
}
async function updateMyStable(formDataParam) {
let headers = new Headers();
const response = await fetch("/updateMyStable", {
method: "POST",
body: formDataParam,
headers
});
const body = await response.json();
return body;
}
下面是我的服务器端端点。在“updateRtable”端点中,我更新了兔子表并获取最大的兔子 ID 并将该值存储在lastInsertedRId变量中。之后,“updateMyStable”端点使用表单参数更新 MyStuff 表,并使用lastInsertedRId。
app.post("/updateRtable", (req, res) => {
console.log("went inside rabbit");
console.log(req.body.RName);
let successful = true;
con.query(`INSERT INTO RABBIT(R_ID, RABBIT_NAME, DATE_OF_BIRTH, RABBIT_STATUS, SEX, BREED) VALUES (NULL, '${req.body.RName}', '${req.body.dob}', '${req.body.rStat}', '${req.body.sex}', '${req.body.breed}')`, function(err, result, fields) {
if (err) {
successful = false;
console.log(err);
} else {
//to get rabbitID
console.log("went inside fetching maximum id");
con.query(`SELECT max(R_ID) FROM RABBIT`, function(errinside, r, f) {
if (errinside) {
successful = false;
console.log(errinside);
} else {
lastInsertedRId = JSON.parse(JSON.stringify(r))[0]['max(R_ID)'];
}
});
}
});
if (successful === true) {
res.status(200).send({
success: true
});
} else {
res.status(ERROR_STATUS_CODE).send({
success: false
});
}
});
app.post("/updateMyStable", (req, res) => {
console.log("went inside mystuff table");
let successful = true;
con.query(`INSERT INTO MYSTUFF(R_ID, NOTES, Kibble, Carrier, Medication, Treats, Blankets, Toys, Drop_off_Date, Pick_up_Date) VALUES ('${lastInsertedRId}', '${req.body.notes}', '${req.body.kibble}', '${req.body.carrier}', '${req.body.medic}', '${req.body.treats}', '${req.body.blankets}', '${req.body.toys}', '${req.body.dropD}', '${req.body.picKD}')`, function(err, result, fields) {
if (err) {
console.log(err);
successful = false;
}
});
if (successful === true) {
res.status(200).send({
success: true
});
} else {
res.status(ERROR_STATUS_CODE).send("Server side error");
}
});
目标
由于 MyStuff 表持有 Rabbit 表的外键,我显然想完全完成对第一个端点的调用(更新表并获取最新的 ID),为了实现这个目标,我正在尝试使用 async /await 在执行下一个端点之前等待来自服务器端的响应。
问题
但是,第二个端点在第一个端点完成之前正在执行。具体来说,我发现执行“ updateMyStable ”端点时 lastInsertedRId 尚未更新。
解决方案
con.query()
是异步的。因为它是异步的,所以它只等待该行并开始执行其他端点。这就是为什么你的代码有问题
推荐阅读
- wordpress - Wordpress wp_schedule_event localhost cURL 错误 7
- sql - 子查询在每个环境中以不同的顺序返回数据
- flutter - Flutter 在移动设备上使用 Floor 缓存数据,但也想为 Web 构建
- c - 尝试编写一个要求用户输入括号和方括号的程序。然后程序将告诉用户他们是否正确嵌套
- c# - .NET 5 Web API 中的身份验证和授权
- powershell - 使用 CSV 源在 powershell 中重命名部分文件
- sql - 查找给定日期和星期几的最近星期几
- arrays - Bash 数组只包含一个元素
- windows - 远程连接机器。如何在仅通过 USB 连接到另一台远程联网机器的远程机器上执行 .exe?
- vue.js - vue.js 数字复选框值