我遇到了对jquery ajax调用PHP请求的数据的异步处理问题。我正在从MySQL读取数据。
正在正确读取数据,但是在PHP提供数据之前,javascript正在进行处理。控制台日志显示了这一点,因为我想要它的数据不存在,尽管它在$ ajax成功后存在,并且因为日志条目的顺序是相反的。
我在SO和其他地方看过几个类似的问题,例如: jquery to php (wait for php script until result/finish) Wait for external method to complete before finishing? 但这些对我没有帮助。抱歉不理解。
我尝试了ajaxComplete方法,但没有解决它。我尝试将值(list_items和status)加载到div中,我可以在HTML页面中看到它,但是尝试从那里检索它返回'',所以当我尝试获取其文本时显然还没有。
我认为答案涉及回调的使用,但我没有找到一个我可以适应我的代码工作的例子,因为我无法理解如何在下面的情况下使用回调,尽管阅读{{ 3}}和其他来源。
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";
}
?>
答案 0 :(得分:0)
回调完全符合您的需求。他们也不难。
$.ajax({ ....
success: function(data) {
do_something(data);
}
});
function do_something(data) {
... do something useful here ...
}
除了将其分配给变量然后进行一些记录之外,您实际上并没有对返回的数据进行任何操作。
答案 1 :(得分:0)
Javascript经常使用异步处理。这意味着,你开始做事,而不是等待它完成(没有办法“等待” - 这是有意的),你传递一些代码,以便在处理完成后运行。
这一开始很难习惯!您必须更改“正常”数据流,如下所示:
v = calculateSomeData(); doSomethingWithData(d)
这样的事情:
onFinish = function(d){doSomethingWithData(d); } calculateSomeData(onFinish)
你想要“等待数据”的事情是什么(你真的没有在这里告诉我们)......那个东西应该在你的success()回调中从ajax开始运行。