在JavaScript函数中使用AJAX调用的结果

时间:2014-08-22 12:50:09

标签: javascript ajax

我意识到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)吗?

编辑1:

如前所述,虽然How do I return the response from an asynchronous call?中的答案非常全面且内容丰富,但它使用jQuery而不是JavaScript来回答问题。

编辑2和答案:

我无论出于何种原因都无法回答我自己的问题,但这是公平的,因为实际上我在问之前应该三思而后行。谢谢你们的所有答案。

  • 道歉,这确实是上面链接的问题的重复
  • Egg Vans建议重新考虑这个问题。这确实是一种方式。事实上,在PHP页面创建评级系统时,可以在用户投票时实际调用PHP函数。我的系统要求用户点击“星星”进行投票。因此,我可以将onclick回调设置为PHP函数而不是JS函数,并将AJAX一起绕过。
  • 但是我不能这样做的原因是因为找出用户选择的星数需要调用DOM函数。

现在,虽然我认为自己是一个好的程序员,但问题是在这种特殊情况下,我完全忽略了代码。原始问题包含从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
    ...
}

再次感谢您的耐心等待。希望这个具体的例子可以帮助别人。

2 个答案:

答案 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); }