JavaScript - AJAX 等待 Return 来自 PHP 的值

JavaScript - AJAX wait for Return Value from PHP

我是 AJAX 的新手。我的目标是在 JavaScript 中打开一个 php 文件。

function checkCorrect(userEntry, solution) {
    return fetch("checkSolution.php", {
    method: "POST",
    headers: {
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    },
    body: `userEntry=${userEntry}&solution=${solution}`,
    })
    
    .then((response) => response.text())
    .then((res) => (res))
    .catch(err => console.log("checkCorrect: " + err));
} 

function checkSolution() {
  result = checkCorrect(userEntry, solution);
  alert(result)
}   

我的问题是,checkSolution 中的 alert() 显示“[object Promise]

而不是来自 php 的实际价值。在 php 中只有一个

echo "hi";

谢谢, 大马

其实fetch是异步的。我不知道。 就我而言,我正在寻找同步方法。

XMLHttpRequest 对我来说是正确的方法。

解决方法如下:

function checkCorrect(userEntry, solution) {
    var ret_value = null;

    var xmlhttp=new XMLHttpRequest();
    xmlhttp.onreadystatechange=function() {
        if (this.readyState==4 && this.status==200) {           
            ret_value =  xmlhttp.responseText;
        }
    }
    
    xmlhttp.open("POST","checkSolution.php",false);
    xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xmlhttp.send("userEntry="+userEntry+"&solution="+solution);

    return ret_value;
}

xmlhttp.open()的第三个参数是重要的部分:

如果 true = 异步,如果 false = 同步

谢谢,BM

你需要在 function 声明之前使用 async 以便 JS 知道这是一个异步函数,你还需要使用 await 等待承诺解决。这是一个例子:

function async checkCorrect(userEntry, solution) {
    try {
      const requestParams = {
        method: "POST",
        headers: {
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        },
        body: `userEntry=${userEntry}&solution=${solution}`,
      }
      
      const result = await fetch("checkSolution.php", requestParams)
        .then((response) => response.text())
        .then((res) => (res))
 
      return result;
    } catch(e) {
      handleYourError(e);
    }
} 

function checkSolution() {
  result = checkCorrect(userEntry, solution);
  alert(result)
}