質問:
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;
}
});