2016-09-10 14 views
0

私の問題を再開するには、TableRow()関数から返された値(miniTable)を取得するために、多くのXMLHttpRequest()ロケットを使用しています。問題は、TableRow()関数の最後にあるalert()を使って、私が必要とする値を正確に持っていますが、TableContent2変数に "Undefined"という値があります。どうしてか分かりません!!ここで私が使用しているすべてのJSファイル(変数と変数を計算するコードは気にしないでください)。私は本当にあなたの助けが必要です。なぜなら、私は3日以来それを塞いでいるからです。再びありがとう、良い午後freinds。XMLHttpRequest()javacript

(function() { 
xmlhttp = new XMLHttpRequest(); 
xmlhttp.onreadystatechange = function() { 
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
    myFunction(xmlhttp); 
} 
}; 
xmlhttp.open("GET", "File1.xml", true); 
xmlhttp.send(); 
})(); 
function ContentFunction(func) { 
TableContent2 = TableRow(); 
alert(TableContent2); 
} 
function TableRow() { 
xmlhttp3 = new XMLHttpRequest(); 
xmlhttp3.onreadystatechange = function() { 
    if (xmlhttp3.readyState == 4 && xmlhttp3.status == 200) { 
    texttest = myFunction2(xmlhttp3); 

    alert(miniTable); 
    return miniTable; 
    } 
}; 
xmlhttp3.open("GET", "File2.xml", true); 
xmlhttp3.send(); 
} 
function myFunction2(xml) { 
var xmlDoc2 = xml.responseXML; 
var ObjectText; 
var x = xmlDoc2.getElementsByTagName("Clip"); 
/*Calcule de ObjectText*/ 
    alert(ObjectText); 
return ObjectText;  
} 
function myFunction(xml) { 
xmlhttp2 = new XMLHttpRequest(); 
var xmlDoc = xml.responseXML; 
var x = xmlDoc.getElementsByTagName("Film"); 
xmlhttp2.onreadystatechange = function() { 
    if (xmlhttp2.readyState == 4 && xmlhttp2.status == 200) { 
     myFunction2(xmlhttp2); 
    } 
}; 
xmlhttp2.open("GET", "File2.xml", true); 
xmlhttp2.send(); 
} 
+0

のXMLHttpRequest機能することができません 'retun'非同期であるため。 – yuriy636

+0

[非同期呼び出しからの応答を返すにはどうすればよいですか?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – yuriy636

+0

私はすべてのコールバック関数を試して、trueをfalseにしようとしましたが、非同期呼び出しを回避するためにコードに変更を提案するのはいつもあなたの価値です。私はXMLHttpRequest()を呼び出す他の関数を呼び出すXMLHttpRequest()を呼び出す関数を使用します。 – HappyDAD

答えて

0

TableRowは何も返しません。 returnの声明はxmlhttp3.onreadystatechangeにありますが、それ以前の範囲にはありません。それ以外に、xmlhttp3は非同期に設定されているため、AJAXの情報を直接返すことはできません。非同期要求(非使用の理由)は、要求が完了したときに壊れる無限ループのように動作するため、直接読み取ることができます(for(;xhr.readyState!==4;);、これを手動で実行すると要求とスクリプトの実行が一時停止します)。永遠に、これは同期リクエストが以前になされた理由です)。

同期リクエストは、ページ/スクリプトの実行を一時停止するため、ページ全体とのやりとりを中断します。たとえば、アニメーションを持っている場合は、イベントリスナーを含むアニメーションが一時停止されます。

また、miniTableがコードのどの部分でも宣言されていないようです。

コールバック関数の使用を検討すると、それらはTableRowスコープに格納され、余分な引数で後で呼び出すことができます。

これがベースです:

function ContentFunction(func) { 
    TableRow(function(TableContent2) { 
     alert(TableContent2); 
    }); 
} 

function TableRow(doneFnc) { 
    var xmlhttp3 = new XMLHttpRequest; 
    xmlhttp3.onreadystatechange = function() { 
     if (xmlhttp3.readyState === 4 && xmlhttp3.status === 200) { 
      var texttest = myFunction2(xmlhttp3); 

      /* success callback */ 
      doneFnc(texttest); 
     } 
    }; 
    xmlhttp3.open("GET", "File2.xml", true); 
    xmlhttp3.send(); 
} 
+0

私はあなたの助けに感謝し、まずあなたを考えたいと思います。あなたの命題に関して、それはTableRow(doneFnc)に入りますが、 "alert(TableContent2)"という呼び出しの中に警告を表示していません(警告は一切表示されません)、/ *成功のコールバック* /とはどういう意味ですか?完成する部分? – HappyDAD

+0

@HappyDADはい、要求が200ステータスで正常に完了したとき。それが何かを警告していない場合、私はあなたの要求が決してうまくいっていないと信じています。 – Hydro

+1

ありがとう、あなたが提案した解決策を働いていると思います。以前のコメントを残念に思っています。私は自分のコードをうまくテストし、最終結果を皆さんに(そしてすべての興味を持った人たちに)渡します。本当にありがとう、私の人生を救ってくれてありがとう。宜しくお願いします。 (愛とパリから) – HappyDAD