1

質問:

ajaxが成功関数の実行を終了するまでjavascriptを一時停止する方法はありますか?

関連コード:

function validateinput (name, parent, access)
{
    //we assume that the input does not exist
    exists = false;
    //validate with server, expected response is true or false
    $.post("AJAXURL", {action: "category", name: name, parent: parent}, 
    function (data, textStatus, xhr)
    {
        //if returned true, the entry does exist for that parent
        if (data == "true")
        {
            alert("AJAX");
            exists = true;
        }
        else
            exists = false;
    });

    switch (true)
    {
        //If the name field is blank (still displaying hint)
        case (name == 'Subcategory Name' || name == 'Category Name'):
            alert("Please enter a name");
            break;
        //if the name already exists for that parent
/*****/     case (exists == true):
            alert("SWITCH");
            break;
        //if the parent field is displaying hint, assume parent is blank
        case (parent == 'Parent Category'):
            parent = '';
            break;
        //if the usergroup field is blank, assume value of parent
        case (access == 'UserGroup Allowed To View'):
            //if parent is also blank, assume lowest level usergroup access
            if (parent == '')
                access = "UserGroupTicketWorkers";
            else
                    $.post("AJAXURL", {action: "specificcat", name: parent}, 
                function (data, textStatus, xhr)
                {
                    access = data['access'];
                }
                );
            break;

        default:
            return true;
    }
    return false;
}

問題の詳細な説明:

  • ユーザーがページ内のリンクをクリックして、この関数を起動します。
  • 関数は、ユーザー入力にエラーがあるかどうかにかかわらず、true または false を返します。
  • このコードが実行されると、受信するalert("SWITCH");前に受信しますalert("AJAX");(2 番目のケースの状態は現在正しいです。何が起こっているのかを把握するためにデバッグで反転させました)
  • 2番目のケースをデフォルトの直前に移動する一時的な修正がありますが、サーバーが応答するよりも高速なコンピューターがスイッチ比較をより速く実行する可能性があるため、永続的な解決策ではない. (そのように機能しない場合を除きます)、タイマーを設定して事前に設定した時間待機すると、サーバーの実行速度が通常より遅い場合に同じ問題が発生する可能性があります
  • サーバーとの通信に時間がかかるため、ajax呼び出しから新しい値を取得していないことを認識しているため、最初に考えたのは、ajax成功関数が完了するまで関数を一時停止する方法を見つけることです。
  • この関数は値を返す必要があるため、ajax 呼び出し内にスイッチを配置することはできません。

解像度

私は非同期設定を使用しましたが、それは魅力的に機能しました。コードを から に変更し、投稿するように設定するだけ$.post()でし$.ajax()

$.ajax(
{
    url: "plugins/actions/edittickets/libs/changetickets.php", 
    type: 'POST',
    data: 
    {
        action: "category", 
        name: name, 
        parent: parent
    }, 
    async: false,
    success: function (data, textStatus, xhr)
    {
        //if returned true, the entry does exist for that parent
        if (data == "true")
            exists = true;
    }
}); 
4

2 に答える 2

1

exists次のように、代わりに return を試してください。

function validateinput (name, parent, access)
{
    //we assume that the input does not exist
    var exists = false;
    //validate with server, expected response is true or false
    $.post("AJAXURL", {action: "category", name: name, parent: parent}, 
    function (data, textStatus, xhr)
    {
        //if returned true, the entry does exist for that parent
        if (data == "true")
        {
            alert("AJAX");
            exists = true;
        }
        else
            exists = false;

        switch (true)
        {
            //If the name field is blank (still displaying hint)
            case (name == 'Subcategory Name' || name == 'Category Name'):
                alert("Please enter a name");
                break;
            //if the name already exists for that parent
            case (exists == true):
                alert("SWITCH");
                break;
            //if the parent field is displaying hint, assume parent is blank
            case (parent == 'Parent Category'):
                parent = '';
                break;
            //if the usergroup field is blank, assume value of parent
            case (access == 'UserGroup Allowed To View'):
                //if parent is also blank, assume lowest level usergroup access
                if (parent == '')
                    access = "UserGroupTicketWorkers";
                else
                    $.post("AJAXURL", {action: "specificcat", name: parent}, 
                    function (data, textStatus, xhr) {
                        access = data['access'];
                    });
                break;

            default:
                exists = true;
        }
    });
    return exists;
}
于 2012-12-06T20:54:35.273 に答える
0

'async':falseパラメーターのリストに追加することで、本当に必要な場合は、AJAX クエリを同期的に送信できます。

詳細については、ドキュメントを参照してください: http://api.jquery.com/jQuery.ajax/

しかし、他の人がコメントで指摘したように、これは switch の仕組みではないため、switch ステートメントを理解し、対応するコードを変更する必要があります。詳細については、こちらを参照してください: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/switch

于 2012-12-06T20:45:41.477 に答える