Ajax経由でXMLを取得し、成功時に関数を呼び出して処理しています。
成功関数(handleHousestark)から、XMLをチェックし、別のデータ(getJonSnow)を呼び出して追加データを追加しています。getJonSnowをasync:falseに設定すると、すべて正常に機能します。それなしでは機能しません。
$( document ).ready(function() {
$( "#button" ).click(function() {
$.ajax({
url: "test_php.php?function=getmain",
cache: false,
success: handleHousestark
});
});
});
function handleHousestark(html) {
var feature="";
var xml = html;
xmlDoc = $.parseXML( xml );
$xml = $( xmlDoc );
$($xml).find( "features" ).children().each(function(index) {
var attributevalue = $(this).attr('value');
var attributeunittype = $(this).attr('type');
var attributecode = $(this).attr('code');
if(attributeunittype!="Valuelist") {
feature=feature+"<B>"+attributevalue+"</B><BR/>";
}
if(attributeunittype=="Valuelist") {
values = getJonSnow(attributecode,function(res) {
///THIS WORKS WITH getJonSnow on async false, otherwise doesn't work. feature=feature+"<B>"+res+"</B><BR/>";
});
}
});
$("#content").html(feature);
}
function getJonSnow(attributecode,callback) {
$.ajax({
url: "test_php.php?function=getvalues",
cache: false,
success: callback
});
}
回答 2 件
私は本当にうまくいったawaitとasyncでこれを達成しました。私はここ数年でajaxをやったことがなく、最新の方法論に少し遅れていました。
以下のサンプル、私はこのサンプルをテストしませんでしたが、うまくいけば、他の人がそのことを知っています。
$( document ).ready(function() { $( "#button" ).click(function() { $.ajax({ url: "test_php.php?function=getmain", cache: false }) .done(function(data) { handleHousestark(data); }) ; }); }); async function handleHousestark(html) { var feature=""; var xml = html; xmlDoc = $.parseXML( xml ); $xml = $( xmlDoc ); $($xml).find( "features" ).children().each(function(index) { var attributevalue = $(this).attr('value'); var attributeunittype = $(this).attr('type'); var attributecode = $(this).attr('code'); values=await getJonSnow(attributecode); if(attributeunittype!="Valuelist") { feature=feature+"<B>"+attributevalue+"</B>"+values+"<BR/>"; } } }); $("#content").html(feature); } async function getJonSnow(attributecode) { const tmp = $.ajax({ url: "test_php.php?function=getvalues", cache: false }); return tmp; }
関連記事
- コールバック付きの関数が非同期関数内で実行されないのはなぜですか?
- animate()のjQuery351コールバック関数が機能しない
- jestmockの2番目のパラメーターとして非同期関数を使用するにはどうすればよいですか?
- javascriptのマップ内の非同期関数から製品の値を取得するにはどうすればよいですか?
- React-nativethispropsはコールバック関数で空です
- 「借用した値よりも長生きする可能性がある」または「このクロージャは `Fn`ではなく` FnOnce`を実装する」ことなく、パラメータをクロージャでコールバック関数を作成
- TypeError [ERR_INVALID_CALLBACK]:コールバックは関数である必要があります。 nodejsで未定義を受信しました
- コールバック関数NodeJSの外部で変数値を取得する方法
- エンドコールバック関数でinjectableサービスをinteractJSで使用する
- Nodejsの子プロセスの結果を待機していない非同期関数
私は
$("#content").html(feature);
だと思うfeature=feature+"<B>"+res+"</B><BR/>";
の前に実行される 。 サーバーへの呼び出しには、応答を戻すための時間が必要です。非同期にfalseを設定しない場合、httpリクエストから結果が来る前に以下のコードが実行されます。