Javascript 通过php使用jQuery$.ajax从MysQL检索数据-异步问题

Javascript 通过php使用jQuery$.ajax从MysQL检索数据-异步问题,javascript,php,jquery,mysql,ajax,Javascript,Php,Jquery,Mysql,Ajax,我在异步处理jQueryAjax调用PHP请求的数据时遇到了麻烦。我正在从MySQL读取数据 数据被正确读取,但是javascript在PHP提供数据之前就开始处理了。控制台日志显示了这一点,这是因为尽管$ajax success:之后存在数据,但在我想要的地方没有数据,而且日志条目的顺序颠倒了 我在SO和其他地方看到过几个类似的问题,比如: 但是这些对我没有帮助。对不起,我不明白 我尝试了一个完整的方法,但没有解决它。我尝试将值列表项和状态加载到一个div中,在那里我可以在HTML页面中看到它

我在异步处理jQueryAjax调用PHP请求的数据时遇到了麻烦。我正在从MySQL读取数据

数据被正确读取,但是javascript在PHP提供数据之前就开始处理了。控制台日志显示了这一点,这是因为尽管$ajax success:之后存在数据,但在我想要的地方没有数据,而且日志条目的顺序颠倒了

我在SO和其他地方看到过几个类似的问题,比如: 但是这些对我没有帮助。对不起,我不明白

我尝试了一个完整的方法,但没有解决它。我尝试将值列表项和状态加载到一个div中,在那里我可以在HTML页面中看到它,但是尝试从那里检索它返回的值,所以当我尝试获取它的文本时,它显然还不在那里

我相信答案涉及到回调的使用,但我还没有找到一个可以在我的代码中使用的例子,因为我不明白在下面的情况下如何使用回调,尽管有阅读和其他来源

console.log shows this:
list_items:    status:                       5.html:29
list_items: 3List Items   status: OK         5.html:12
这是我的5.html

<html>
  <head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
    <script>
/* function to READ from MySQL */
    function readMySQL( user_id, todo_name ){
        var params = {user_idPOST: user_id, todo_namePOST: todo_name, action: "read"};
        $.ajax({ type: "post", url: "5.php", data: params, datatype: "text",
            success: function(data){
                list_items = data;
                status = 'OK';
                console.log('list_items:', list_items, '  status:', status); // this is 5.html:12
            },
            error: function(jqXHR, exception) { errorMySQL(jqXHR, exception); }
        });
    }
/* function to signal ERRORS */
    // error handling
    }
/* Start */
    $(document).ready(function(){
        window.list_items = "";
        window.status = "";
        $("#read").click(function(){
            var user_id=3;
            var todo_name='3name';
            readMySQL( user_id, todo_name ); 
            console.log('list_items:', list_items, '  status:', status); // this is 5.html:29
        });
    });
    </script>
  </head>
    <body>
        <form>
            <input type="button" value="Read" id="read"><p>
        </form>
   </body>
</html>
这里是5.php

<?php
  $host = "localhost";  $user = "root";  $pass = "";    $databaseName = "informat_todo";
  $tableName = "todo_list";
  $con = mysqli_connect ( $host, $user, $pass, $databaseName );

  // Check connection
  if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); }
  $action = $_POST["action"];
  $user_id = $_POST["user_idPOST"]; 
  $todo_name = $_POST["todo_namePOST"];

// READ ------------------------------------------------------------------------------------------
    if($action=="read"){
        $show = mysqli_query ( $con, "SELECT * FROM $tableName WHERE user_id='$user_id' AND todo_name='$todo_name' " );
        $found = 0;
        while($row=mysqli_fetch_array($show)){
            $found = 1;
            echo $row[2] ;
        }
        if ($found==0) { echo "failed : "; echo $user_id; echo " / ";   echo $todo_name; echo " not found:"; } 
      }
    else {
        echo "failed : unknown action";
    }
?>

回调正是您所需要的。他们也不难

$.ajax({ ....
    success: function(data) {
         do_something(data);
    }
});

function do_something(data) {
   ... do something useful here ...
}

除了将返回的数据分配给变量然后进行一些日志记录之外,您实际上并没有对返回的数据进行任何处理。

Javascript通常使用异步处理。这意味着,你开始一件事情,而不是等待它完成,没有办法等待-这是故意的,你传递一些代码,让它在处理完成后运行

一开始这有点难适应!您必须像这样更改正常数据流:

v=计算中间数据; doSomethingWithDatad

对这样的事情:

onFinish=函数d{doSomethingWithDatad;} 计算模型完成


不管你想等什么数据,你都不能在这里给我们看。。。这件事应该在ajax的成功回调中启动

我有两个可供选择的数据源,一旦检索到,我必须以同样的方式处理。一个源是数据库,另一个是JSON文件。用户可以选择其中之一。我想从用户选择的任何源检索数据,然后放入公共代码。但是,由于数据不在变量中,甚至在我退出success:function后尝试了一个全局变量,因此直接使用公共代码是不起作用的。也许我应该把通用代码放在一个函数中,并从成功中调用它:我将尝试并报告。没关系。ajax请求是http请求。客户端代码根本不关心产生响应的是什么:服务器发出的一个平面文件,查询数据库的一些代码,或者一大群工资过低的奴隶尽可能快地输入数据:这仍然是一个异步请求。谢谢,是的,我现在已经得到了它。呼叫过程成功:将做我想做的事。你和@BadZen的解释理顺了我的思路。我理解问题的异步本质,但对解决方案的思考是错误的。谢谢