Javascript AJAX请求有时会出错

Javascript AJAX请求有时会出错,javascript,jquery,node.js,ajax,express,Javascript,Jquery,Node.js,Ajax,Express,我在发送和接收请求时遇到问题。在我的服务器端,直到发送前一刻,我得到了我所期望的,但在我的客户端,我把事情弄得乱七八糟。例如,这两个应该与我这里的顺序相反: 从服务器{“网格”:[ 在服务器上收到:{“网格”:[“X”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”]、“获胜者”:“} 函数sendData(json){ $.ajax({ 类型:“POST”, url:“/ttt”, 数据:json, 数据类型:“json”, 成功:receiveData() });

我在发送和接收请求时遇到问题。在我的服务器端,直到发送前一刻,我得到了我所期望的,但在我的客户端,我把事情弄得乱七八糟。例如,这两个应该与我这里的顺序相反:

从服务器{“网格”:[ 在服务器上收到:{“网格”:[“X”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”]、“获胜者”:“}

函数sendData(json){ $.ajax({ 类型:“POST”, url:“/ttt”, 数据:json, 数据类型:“json”, 成功:receiveData() }); } 函数receiveData(){ var响应=$.ajax({ 键入:“获取”, url:“/ttt”, 数据类型:“json”, 成功:函数(){ 网格=response.responseJSON; log(“在客户端接收:+JSON.stringify(grid)); } }); log(“也是在收到”+JSON.stringify(grid)之后);
}您犯了一个常见的错误。对于
receiveData
,您需要使用不带参数的函数引用。更改此项:

function sendData(json) {
    $.ajax({
       type: "POST",
       url: "/ttt",
       data: json,
       dataType: "json",
       success: receiveData()
    });
}
function receiveData() {

    var response = $.ajax({
        type: "GET",
        url: "/ttt",
        dataType: "json",
        success: function(){
            grid = response.responseJSON;
            console.log("Receved at client: " + JSON.stringify(grid));
        }
    });
   console.log("Also after receiving " + JSON.stringify(grid));
}
为此:

function sendData(json) {
    $.ajax({
       type: "POST",
       url: "/ttt",
       data: json,
       dataType: "json",
       success: receiveData     // no parens here
    });
}
当您包含paren时,它会立即调用函数,并将函数的返回值作为成功处理程序,因此您会看到它们无序运行。您希望传递一个函数引用给它,以后可以调用它。函数引用是不带参数的函数名


您似乎在
receiveData()
中又犯了一个错误。您使用了错误的东西作为响应。响应不是从
$.ajax()
返回的。响应被传递给成功处理程序

我不知道你的回答应该是什么样子,但改变一下:

function sendData(json) {
    $.ajax({
       type: "POST",
       url: "/ttt",
       data: json,
       dataType: "json",
       success: receiveData()
    });
}
function receiveData() {

    var response = $.ajax({
        type: "GET",
        url: "/ttt",
        dataType: "json",
        success: function(){
            grid = response.responseJSON;
            console.log("Receved at client: " + JSON.stringify(grid));
        }
    });
   console.log("Also after receiving " + JSON.stringify(grid));
}
对这样的事情:

function receiveData() {

    $.ajax({
        type: "GET",
        url: "/ttt",
        dataType: "json",
        success: function(response){
            grid = response.responseJSON;
            console.log("Received at client: " + JSON.stringify(grid));
            console.log("Also after receiving " + JSON.stringify(grid));
        }
    });
}
而且,因为ajax调用是异步的,所以您还有以下语句
console.log(“也是在接收到”+JSON.stringify(grid))之后)在错误的位置。如果您想在修改后看到网格的结果,那么必须将其放入成功处理程序中


修复程序摘要

  • success:receiveData()
    更改为
    success:receiveData
  • 在将响应传递给成功处理程序时使用
    response
  • 放置
    console.log()
    以查看
    success
    处理程序中的最终结果


  • 您可能还没有完全理解ajax调用是如何异步的,以及这对您的编程意味着什么。我建议对这个话题进行一些搜索和阅读。现在了解这一点将在你成长的过程中为你省去很多痛苦。

    非常感谢,就这样。你说得对,我将花一些时间学习ajax以及如何使用它。