-4

这是功能:

function verificaProva(aluno,prova){
        // define o retorno padrao
        var res = 0;

        // busca informação do servidor
        $.ajax({
            url : "funcoes.php",
            type : 'post',
            dataType : "json",
            data : {acao: "verificaProva", id_aluno: aluno, id_prova: prova},
            success : function(retorno){
                if (retorno.status == "fez"){
                    res = 1;
                    alert("fez");
                } 
            },
            error : function(jqXHR, textStatus, errorThrown){
                alert(textStatus+"\n"+errorThrown);
            }
        });
        return res;
    }

如果 ajax 返回的条件为真,则函数显示警报并将变量箭头指向“1”。

发生了什么是警报正在发出,但变量没有改变,为什么?

4

4 回答 4

1

Ajax 调用是异步进行的,这意味着您传递给成功属性的函数只会在请求发出后一段时间后才会被调用。

所以你的res变量只会在收到服务器的响应后设置。

1 - 这里有 2 个选择,将 ajax 选项的 async 属性设置为 false :

$.ajax({
        //async set to false
        async: false,
        url : "funcoes.php",
        type : 'post',
        dataType : "json",
        data : {acao: "verificaProva", id_aluno: aluno, id_prova: prova},
        success : function(retorno){
            if (retorno.status == "fez"){
                res = 1;
                alert("fez");
            } 
        },
        error : function(jqXHR, textStatus, errorThrown){
            alert(textStatus+"\n"+errorThrown);
        }
    });

2 - 您可以将回调函数传递给您的函数,该函数将在成功函数中调用:

function verificaProva(aluno,prova,callback){
    // busca informação do servidor
    $.ajax({
        url : "funcoes.php",
        type : 'post',
        dataType : "json",
        data : {acao: "verificaProva", id_aluno: aluno, id_prova: prova},
        success : function(retorno){
            if (retorno.status == "fez"){
                //Callback method called
                callback();
                alert("fez");
            } 
        },
        error : function(jqXHR, textStatus, errorThrown){
            alert(textStatus+"\n"+errorThrown);
        }
    });
}

我更喜欢选项 2,因为它不会使浏览器挂起。

于 2013-08-10T20:10:07.583 回答
1

如对 OP 的评论中所述,如何从异步调用返回响应的可能重复项?.

快速回答

ajax 函数的回调是异步执行的。当函数success执行时,函数verificaProva已经返回。基本上发生的事情是:

var  res = 0 is executed

$.ajax({...}) is executed and a request is sent to the server

return res is executed, where res is still equal to 0

... some times later ...

when the server responds to the ajax request the callback (success) is executed, and res is set equal to 1. As I said, however, the original function has already returned so it has no effect.

您可能想了解一下异步执行以及最终的闭包意味着什么。

希望它有所帮助。

于 2013-08-10T20:14:24.120 回答
0

您的 ajax 调用是异步的。这就是“A”在 Ajax 中的含义。因此,直到函数返回res很久之后,成功处理程序才会填充的值。$.ajax()因此,您不能从 ajax 函数返回结果值。

相反,您必须更改编码方式,并且唯一可以使用来自异步调用的返回值的代码是驻留在成功处理程序函数中或从成功处理程序调用的代码。您不能使用异步操作编写同步代码。您必须编写代码以使用异步完成函数。

因此,在您的特定代码中,您可以传入一个回调函数,并且只有在该回调函数中res才能知道 的值:

function verificaProva(aluno,prova, cb){

    // busca informação do servidor
    $.ajax({
        url : "funcoes.php",
        type : 'post',
        dataType : "json",
        data : {acao: "verificaProva", id_aluno: aluno, id_prova: prova},
        success : function(retorno){
            if (retorno.status == "fez"){
                // call the callback function with the status
                cb(1);
                alert("fez");
            } 
        },
        error : function(jqXHR, textStatus, errorThrown){
            alert(textStatus+"\n"+errorThrown);
            // call the callback function with the status
            cb(0);
        }
    });
}
于 2013-08-10T20:08:42.203 回答
0

这是因为 AJAX 调用默认是异步的。因此,您的变量“res”在 ajax 调用结束之前返回。所以它的值为0。

你有两个解决方案:

  • 在您的成功中进行回调以执行需要 res 值的代码部分。
  • 通过设置使 ajax 调用同步async: false(在大多数常见情况下是个坏主意)。
于 2013-08-10T20:10:44.567 回答