1

重複の可能性:
jQuery: ajax 呼び出しの成功後にデータを返す

別の関数から呼び出される次の関数があります。関数が機能したかどうかを確認するには、何かを返す必要があります。

//Function to close any existing connection 
function closeConnection(manual) {
    //Establish connection to php script 
    $.ajax({
        type: 'POST',
        url: 'action/chat/closeconnection.php',
        success: function (feedback) {
            //If this function was called manually, also empty chatTextDiv and fade out chatDiv
            if (manual == true) {
                //Stop getting messages
                clearInterval(setintervalid);
                //Fade out chatDiv
                $('#chatDiv').fadeOut(100);
                //Empty chatTextDiv
                $('#chatTextDiv').html('');
                //Fade in openChatDiv
                $('#openChatDiv').fadeIn(100);
            }
        }
    }).error(function () {
        //Append with connection error - user doesn't know that he is disconnected first so it is better to say this as the function will return false and stop other functions
        if (manual != true) {
            $('#chatTextDiv').append('You could not be connected. Please try again later.<hr/>');
            //Stop getting messages
            clearInterval(setintervalid);
            var closeconnectionsuccess = false;
        }
        elseif(manual == true) {
            $('#chatTextDiv').append('You could not be disconnected. Please try again later.<hr/>');
            var closeconnectionsuccess = true;
        }
    });

    return closeconnectionsuccess;
}

関数の成功を返したいのは、実際には最後の行だけです。コードは機能しません。なぜだめですか?

4

3 に答える 3

3

@Rockitsauceが言ったように、closeconnectionsuccess変数は関数のスコープ内にないため、その時点ではアクセスできません。ただし、さらに重要なのは、jQueryの非同期関数を使用していることを考慮に入れる必要があります。この関数は、コールバック( 、)が呼び出されるcloseConnection前に実行を完了します。HTTPリクエストの完了後に結果を取得する場合は、コールバック関数を独自の関数にも追加して、非同期にする必要があります。successerror

したがって、このコードは機能するはずです。

//Function to close any existing connection 
function closeConnection(manual, callback) {
//Establish connection to php script 
$.ajax({
    type: 'POST',
    url: 'action/chat/closeconnection.php',
    success: function(feedback) {
        //If this function was called manually, also empty chatTextDiv and fade out chatDiv
        if(manual==true)
        {
            //Stop getting messages
            clearInterval(setintervalid);
            //Fade out chatDiv
            $('#chatDiv').fadeOut(100);
            //Empty chatTextDiv
            $('#chatTextDiv').html('');
            //Fade in openChatDiv
            $('#openChatDiv').fadeIn(100);
        }
    }
}).error(function() {
    //Append with connection error - user doesn't know that he is disconnected first so it is better to say this as the function will return false and stop other functions
    if(manual!=true)
    {
        $('#chatTextDiv').append('You could not be connected. Please try again later.<hr/>');
        //Stop getting messages
        clearInterval(setintervalid);
        callback(false);
    }
    elseif(manual==true)
    {
        $('#chatTextDiv').append('You could not be disconnected. Please try again later.<hr/>');
        callback(true);
    }
});
}

closeConnection(manual, function(success) {
    //Process result
});
于 2012-05-09T20:17:36.160 に答える
1

closeconnectionsuccess変数は範囲外です。

于 2012-05-09T20:14:47.107 に答える
1

ajax呼び出しは非同期です。したがって、関数はajax呼び出しが戻る前に終了します。

パスしてコールバック関数を呼び出すか、ajax呼び出しが終了したときにイベントをトリガーする必要があります。

于 2012-05-09T20:16:41.713 に答える