无法将变量传递给 onreadystatechange

问题描述

这是当前的源代码

makefile

尝试了很多方法来主要使用 SO anwsers 来传递它们,每次 var xhttp = new XMLHttpRequest(); function passVars(var1,var2,var3) { if (var1.readyState == 4) { if (var1.status == 200) { var data = var1.responseText; if (data) { playSuccess(); classSwitch(data,var3); } else { playFailure(); alert("Error: returned status code " + var1.status + " " + var1.statusText); } } } } xhttp.onreadystatechange = function() { passVars(xhttp,"tab","p1234"); }; xhttp.open("POST","index.PHP",true); xhttp.send(formData); //formdata is a POST send to PHP's backend which returns responseText = 0 or 1 for var data function classSwitch(state,sOrigin,stateButtonID) { if (sOrigin === "tab") { Monitored = state; if (state === "1") { if (document.getElementById("setmonitoring").classList.contains("productmonitoringdisabled")) { document.getElementById("setmonitoring").classList.remove("productmonitoringdisabled"); } document.getElementById("setmonitoring").classList.add("productmonitoringenabled"); } if (state === "0") { if (document.getElementById("setmonitoring").classList.contains("productmonitoringenabled")) { document.getElementById("setmonitoring").classList.remove("productmonitoringenabled"); } document.getElementById("setmonitoring").classList.add("productmonitoringdisabled"); } } if (sOrigin === "issues") { if (state === "1") { if (document.getElementById(stateButtonID).classList.contains("productmonitoringdisabled")) { document.getElementById(stateButtonID).classList.remove("productmonitoringdisabled"); } else document.getElementById(stateButtonID).classList.add("productmonitoringenabled"); } if (state === "0") { if (document.getElementById(stateButtonID).classList.contains("productmonitoringenabled")) { document.getElementById(stateButtonID).classList.remove("productmonitoringenabled"); } else document.getElementById(stateButtonID).classList.add("productmonitoringdisabled"); } } } var2 都是 var2。这用于库存控制系统,早期 alpha 版本。思路是在后端返回产品当前监控状态时,传递元素的id来改变按钮类

任何想法如何传递这些变量?提前致谢

解决方法

以下是如何将参数传递给 onreadystatechange 回调函数的最小示例。你把它搞得有点过于复杂了——没有必要将你的 xhttp 变量传递给回调,因为它已经在作用域中可用了。

const xhr = new XMLHttpRequest();
xhr.open("GET","https://developer.mozilla.org/");
xhr.send();
xhr.onreadystatechange = function() {
  callback("tab","1234");
};


function callback(var1,var2) {
  console.log(`var1 = ${var1}`);
  console.log(`var2 = ${var2}`);

  //Do your xhr.readyState and xhr.status checks in this function
  console.log(`xhr.readyState = ${xhr.readyState}`);
  console.log(`xhr.status = ${xhr.status}`);
}

,

你的结构不好。你不能在异步调用中像那样传递 xhttp 。直接改成这样...

xhttp.onreadystatechange = function() { 

  if (xhttp.readyState == 4) {

    if (xhttp.status == 200) {

      var data = xhttp.responseText;

      if (data) {

        playSuccess();

        classSwitch(data,'tab','1234');

      } else {

        playFailure();

        alert("Error: returned status code " + xhttp.status + " " + xhttp.statusText);
      }
    }
  }

};