该功能没有返回值,为什么?

时间:2013-08-10 20:02:17

标签: javascript return-value

这是功能:

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 个答案:

答案 0 :(得分:1)

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

因此,只有在收到服务器的响应后才会设置 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 - 您可以将回调函数传递给您的函数,该函数将在success函数中调用:

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,因为它不会使浏览器挂起。

答案 1 :(得分:1)

正如对OP的评论中所述,How do I return the response from an asynchronous call?可能重复。

快速回答

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.

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

希望它有所帮助。

答案 2 :(得分: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);
        }
    });
}

答案 3 :(得分:0)

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

您有两种解决方案:

  • 成功回调,执行需要res值的代码部分。
  • 通过设置async: false使ajax调用同步(在大多数情况下都是个坏主意)。