-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 リターンの条件が true の場合、関数はアラートを表示し、変数を「1」にアローします。

アラートが発行されているのに、変数が変化しないのはなぜですか?

4

4 に答える 4

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 - 成功関数で呼び出されるコールバック関数を関数に渡すことができます。

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呼び出しは非同期です。それが、Ajax の「A」の略です。そのため、 の値は、関数が戻って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 です。

2 つの解決策があります。

  • res の値を必要とするコードの部分を実行するために、成功時にコールバックを作成します。
  • 設定によって ajax 呼び出しを同期させますasync: false(ほとんどの場合、悪い考えです)。
于 2013-08-10T20:10:44.567 に答える