0

これは機能しているコードですが、私が必要とする方法でもありません。後で説明します。

getRegisterFiles('regster1')
function getRegisterFiles(name) {
    var request = $.ajax({
        url: "/../files/Users/"+name+".ctp",
        type: "GET",
        dataType: "html"
    });
    request.fail(function(jqXHR, textStatus) {
        $('#pageLoading p').html('We have experienced a problem. Please try again later.');
        return false;
    });
    request.success(function(msg) {
        placeData(msg);
    });
}
function placeData(registerData) {
    $('#pageWrap').html(registerData);                      
}

したがって、上記のコードは .ctp ファイルを取得し、それを画面に表示します。

私がする必要があること

成功部分に placeData(msg) を含める代わりに、「msg」の内容を、関数を開始する変数に返す必要があります。

register = getRegisterFiles('register1');

使ってみましたが、

return msg;

しかし、それは機能しません... return msgを使用してから「アラート」すると、未定義として表示されます。

次に何をすべきかわからないので、どんなアイデアでも大歓迎です。完全な初心者の間違いでしたら申し訳ありません。

編集--- これは私が試したコードです。私がやろうとしていることを示すのに役立つことを願っています。

var registerStep1 = null;
var registerStep2 = null;
function getRegisterFiles(name) {
    var request = $.ajax({
        url: "/../files/Users/"+name+".ctp",
        type: "GET",
        dataType: "html",
        error: function(jqXHR, textStatus) {
            $('#pageLoading p').html('We have experienced a problem. Please try again later.');
            return false;
        },
        success: function(msg) {
                return msg;
        }
    });
}
registerStep1 = getRegisterFiles('registerStep1');
registerStep2 = getRegisterFiles('registerStep2');
var tempInterval = setInterval(function() {

    if(registerStep1 != null && registerStep1 != false) {
        if(registerStep2 != null && registerStep2 != false) {
            clearInterval(tempInterval);
            placeData(registerStep1);
        }
    }
}, 100);
function placeData(registerData) {
    var tempTimer = 0;
    tempTimer = setInterval(function() {
        if(controlTimeUp != false) {
            $('#pageWrap').html(registerData);
            methodToFixLayout();
            $('#pageWrap').fadeIn("slow");
            $('#pageLoading').css("display","none")
            clearInterval(tempTimer);
        }
    }, 10)
}
4

2 に答える 2

2

あなたはそれを正しくやっています。AJAX 呼び出しは、呼び出し元に値を返すことはできません。これは、AJAX が非同期であるためです。(これは、AJAX の最初の「A」が表すものです)。への呼び出しgetRegisterFiles('register1')はすぐに返されます。サーバーからの応答をブロックして待機することはありません。したがって、サーバーからの応答に関連する値を返すことはできません。

AJAX リクエストの非同期性に関する StackOverflow の別の質問を次に示します 。AJAX 呼び出しはブロックされていませんか。

さらに説明を追加するために更新されました:

これらの例を確認するには、Firefox 用のFireBug拡張機能をインストールするか、Chrome を使用してください。それぞれ FireBug または開発者ツールを開き、コンソール タブを監視します。

ここでは、コードを取得し、多くのログ メッセージを追加して、実行の順序を明らかにしました。

console.log('Defining function getRegisterFiles()');
function getRegisterFiles(name) {
    console.log('enter: getRegisterFiles()');
    var request = $.ajax({
        url: "/../files/Users/"+name+".ctp",
        type: "GET",
        dataType: "html"
    });
    console.log("configuring failure handler");
    request.fail(function(jqXHR, textStatus) {
        console.log('enter: failure callback function');
        $('#pageLoading p').html('We have experienced a problem. Please try again later.');
        console.log('exiting: failure callback function');
        return false;
    });
    console.log("configuring success handler");
    request.success(function(msg) {
        console.log('enter: success callback function');
        placeData(msg);
        console.log('exiting: success callback function');
        return msg;
    });
    console.log('exiting: getRegisterFiles()');
    return "This is the return value of getRegisterFiles()";
}

console.log("defining placeData() function');
function placeData(registerData) {
    console.log('enter: placeData();  registerData="+registerData);
    $('#pageWrap').html(registerData);
    console.log('exiting: placeData()');
}

console.log("calling getRegisterFiles()');

var result = getRegisterFiles('regster1')
console.log("getRegisterFiles() finished;  result="+result);

ログ メッセージのシーケンスにより、実行の順序がより明確になります。呼び出すときにgetRegisterFiles()、いくつかのパラメーターを構成し、要求を開始します。その後、関数は戻ります。サーバーからの応答がまだないため、まだ対応できません。これは、「getRegisterFiles() finished」を含むログ メッセージに表示されます。しばらくすると、サーバーから応答が返されます。このとき、jQuery は成功ハンドラーとして登録した関数を呼び出します。技術的には関数から値を返すことはできますが、jQuery がそれを呼び出したため、戻り値は jQuery に返され、そこで単に無視されます。

コメントに従って、割り当てが使用される別のバリ​​エーションを次に示します。

var dataFromTheServer = "An initial value";

console.log('Defining function getRegisterFiles()');
function getRegisterFiles(name) {
    console.log('enter: getRegisterFiles()');
    var request = $.ajax({
        url: "/../files/Users/"+name+".ctp",
        type: "GET",
        dataType: "html"
    });
    console.log("configuring failure handler");
    request.fail(function(jqXHR, textStatus) {
        console.log('enter: failure callback function');
        $('#pageLoading p').html('We have experienced a problem. Please try again later.');
        console.log('exiting: failure callback function');
        return false;
    });
    console.log("configuring success handler");
    request.success(function(msg) {
        console.log('enter: success callback function');
        dataFromTheServer = msg;
        console.log('exiting: success callback function');
    });
    console.log('exiting: getRegisterFiles()');
    return "This is the return value of getRegisterFiles()";
}

console.log("defining placeData() function');
function placeData(registerData) {
    console.log('enter: placeData();  registerData="+registerData);
    $('#pageWrap').html(registerData);
    console.log('exiting: placeData()');
}

console.log("calling getRegisterFiles()');

getRegisterFiles('regster1')
console.log("getRegisterFiles() finished;  dataFromTheServer="+dataFromTheServer);
placeData(dataFromTheServer);

これが意図したとおりに機能しない理由は、サーバーがリクエストに応答する前に placeData() が (かなり) 呼び出され、割り当てがまだ行われていないためです。最終的に、応答が受信されると、割り当てが行われますが、その時点では関数が呼び出されないため、その値では何も行われません。

さらに、グローバル名への割り当て手法を使用しないことをお勧めします。ローカル変数を使用すると、グローバル変数を使用するよりも、デバッグが容易になり、正確性を検証しやすくなり、変化するニーズに合わせてソフトウェア プロジェクトを変更するときにコードを再利用しやすくなります。

于 2012-07-31T22:56:22.723 に答える
0

どこで返品を試みていますか?範囲内である必要があります:

request.success(function(msg) {
    placeData(msg);
    return msg;
});

それがそこの外にある場合、それは未定義です。

次に、そうでない場合は、別のプラグインを使用しているかどうかはわかりませんが、このように成功/失敗を処理する必要がありますか?

function getRegisterFiles(name) {
    var request = $.ajax({
        url: "/../files/Users/"+name+".ctp",
        type: "GET",
        dataType: "html",
        error: function(jqXHR, textStatus) {
            $('#pageLoading p').html('We have experienced a problem. Please try again later.');
            return false;
        },
        success: function(msg) {
            return msg;
        }
    });
}

それがここで定義されている方法です:http://api.jquery.com/jQuery.ajax/

于 2012-07-31T19:42:56.910 に答える