JavaScript 不等待来自端点的响应

Posted

技术标签:

【中文标题】JavaScript 不等待来自端点的响应【英文标题】:JavaScript not waiting for the response from the endpoint 【发布时间】:2021-08-28 22:11:21 【问题描述】:

背景

这是客户端 javascript,我在其中发出发布请求以使用表单参数更新相应的表。我的数据库有两个表——Rabbit 表和 MyStuff 表,MyStuff 表保存了 rabbit 表的外键。现在,我首先通过发出一个 post 请求来更新 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 我在执行下一个端点之前等待来自服务器端的响应。

问题

但是,第二个端点在第一个端点完成之前正在执行。具体来说,我发现 lastInsertedRId 在执行“updateMyStable”端点时尚未更新。

【问题讨论】:

if(successful===false) res.status(200).send(success: true); ,您的第一个端点中的这段代码是一个错字,如果成功为真,则应该从响应中发送 200 对吗? 改掉写=== false=== true的习惯。只需写if (successful)if (!successful) 问题是您在查询完成之前从端点发送响应。 con.query() 是异步的。 这意味着您在回调函数中设置successful 变量之前对其进行检查。 顺便说一句,您不需要使用其他查询来获取lastInsertedRid。它在result.insertId 【参考方案1】:

con.query() 是异步的。因为它是异步的,所以它只等待该行并开始执行其他端点。这就是为什么你的代码有问题

here is a related issue

【讨论】:

以上是关于JavaScript 不等待来自端点的响应的主要内容,如果未能解决你的问题,请参考以下文章

泽西客户端异步 POST 请求不等待响应

使 Java 客户端等待直到收到来自服务器的响应的程序

是否可以在 Java 或 JavaScript 中发出 HTTP (POST) 请求而无需等待响应

Spring Boot Webclient - 等待多呼叫的结束响应

身份服务器 - 将自定义参数添加到来自令牌端点的 JSON 响应

如何使用来自 3rd 方站点的 URL 端点进行 JSON 响应