我意识到StackOverflow上已经提出了这个问题,但答案主要集中在jQuery上。
How do I return the response from an asynchronous call?
我有一个JavaScript功能,允许网站上的人投票。但是他们每天只能投票一次。所以我试图调用另一个正在进行AJAX调用的JS函数。这又调用了一个PHP页面,它在数据库中进行查询,以检查调用者是否在过去24小时内投票。
function can_vote(user_id)
{
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "rating.php?&user_id=" + user_id, true);
xmlhttp.send();
var result = true;
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
console.log("answer: " + xmlhttp.responseText);
return (xmlhttp.responseText == "false") ? false : true; // doesn't work
}
}
}
function rating(user_id)
{
if (can_vote(user_id) == false)
{
// display error message
...
return false;
}
...
}
由于我之前提供的链接中解释的原因,这不起作用。我试图按照此链接中建议的建议但我无法使其工作(我只能使用JavaScript而不是jQuery)。我试图实现一个回调系统:
can_vote(callback, user_id)
{
...
xmlhttp.onreadystatechange=function()
{
// if we can a positive answer from the rating.php
// then call the callback function
callback();
}
}
function rating(user_id)
{
var result = false;
can_vote(function() {
result = true;
}, user_id);
console.log(result); // always false
...
}
但是当机制工作时,它不会更新变量true,这似乎是回调函数的“本地”。
感觉我接近解决方案,但不能再进一步了。通过引用函数传递一个变量在JS中不起作用,所以我已经探索了我能想到的所有选项。
有人可以帮助并建议修复/解决方案(仅使用JavaScript)吗?
如前所述,虽然How do I return the response from an asynchronous call?中的答案非常全面且内容丰富,但它使用jQuery而不是JavaScript来回答问题。
我无论出于何种原因都无法回答我自己的问题,但这是公平的,因为实际上我在问之前应该三思而后行。谢谢你们的所有答案。
onclick
回调设置为PHP函数而不是JS函数,并将AJAX一起绕过。现在,虽然我认为自己是一个好的程序员,但问题是在这种特殊情况下,我完全忽略了代码。原始问题包含从JS函数中“处理”AJAX调用结果的正确答案。所以我忽略的是,事实上,AJAX调用的实际结果将在回调函数中被“处理”。所以例如在我的情况下如果用户可以投票,那么我应该在这个回调函数中执行一些代码,如果他/她不能投票,我应该在同一个回调函数中执行一些其他代码。换句话说:
function can_vote(callback, user_id)
{
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "rating.php?user=" + user_id, false);
xmlhttp.send();
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
// pass the result to the callback function and process this result accordingly
callback(xmlhttpx.responseText);
}
}
}
function star_rating(user_id)
{
...
can_vote(function(result)
{
if (result == false)
{
// you can't vote display error message
}
else
{
// you can vote do your stuff here, find out what's the rating from the user
// add it to the db, and update the current rate yet using another
// AJAX call.
}
}, user_id);
// any code you put after this line will be processed likely before the AJAX call returns
...
}
再次感谢您的耐心等待。希望这个具体的例子可以帮助别人。
答案 0 :(得分:2)
AJAX中的A
代表异步。这意味着你的JS不会等到AJAX完成,然后继续下一件事(换句话说它不会“阻止”脚本)。
这就是为什么你有一个在调用完成时执行的回调函数。只有拥有所需数据时才会触发回调。
答案 1 :(得分:0)
我相信你应该在你的回调函数中移动console.log:
function rating(user_id) {
var result = false;
can_vote(function(result) {
result = true;
console.log(result);
}, user_id); }
你总是有"假"结果是因为您正在使用异步回调。
<强> UPD:强>
也许我没有抓住你的问题。如果你需要处理回调的结果,只需从回调函数体调用你的处理方法:
can_vote(function(result) {
processCanVoteResult(result); //call result processing
}, user_id); }