JavaScript非同期コールバックを待機中@ HTTPポスト
-
22-07-2019 - |
質問
小さな機能を実装していますが、ちょっと立ち往生しています。
次のようなアクションを実行するボタンがあります
<input type="submit" value="My Button" onclick="javascript:DoSomething();" />
ユーザーがボタンをクリックすると、DoSomething関数が呼び出されます。
function DoSomething()
{
var geocoder = new GClientGeocoder();
geocoder.getLocations(map.getCenter(), function SetField(response)
{
if (!response || response.Status.code != 200)
{
alert("Status Code:" + response.Status.code);
}
else
{
var place = response.Placemark[0];
$('#someHiddenField')[0].value = place.AddressDetails.Country.CountryNameCode;
}
});
}
関数の内部にコールバック関数が定義され、フォームフィールドに都市名を書き込む非同期操作を実行します。問題は、ページがポストされた後に非同期コールバックがフィールドに書き込もうとすることです。ポストプロセスがコールバック結果を待つようにすることができましたか?コールバックはGoogle Maps APIで定義されており、回避できません。
事前に感謝
解決
まず、onclickハンドラコードを変更して、次のようなreturnステートメントを含めます。
<input type="submit" value="My Button" onclick="javascript:return DoSomething();" />
DoSomething関数を変更してfalseを返すようにし、非同期コールバックで作業している場合にsumitがキャンセルされるようにします。そして、完了時にフォームを投稿するように非同期コールバックを変更します。
function DoSomething(doPost)
{
var geocoder = new GClientGeocoder();
geocoder.getLocations(map.getCenter(), function SetField(response)
{
if (!response || response.Status.code != 200)
{
alert("Status Code:" + response.Status.code);
}
else
{
var place = response.Placemark[0];
$('#someHiddenField')[0].value = place.AddressDetails.Country.CountryNameCode;
// resubmit the form here
$('#yourFormID').submit();
}
});
return false; // cancel the submitting of the form
}
さらに別のアプローチは、フォームに onSubmitハンドラ を含め、グローバルフラグを使用して、フォームの送信が許可されているかどうか(つまり、飛行中の非同期コールバックはありません)。非同期コールバックが返されたら、フラグをクリアし、上記で示したようにJavaScriptからフォームを再送信し、 フォームで submit()メソッド を呼び出します。要素 。
他のヒント
フォームが投稿されないように、送信ボタンの代わりに通常のボタン(type =&quot; button&quot;)を使用します。代わりに、コールバック関数からフォームを投稿してください。
所属していません StackOverflow