0

このコードは、async が false に設定されている場合にのみ機能します。なぜですか?

var contact =
{
    XMLHttp : null,
    XMLDoc : null,
    TXTDoc : null,

    getData : function(dataSource)
    {
        contact.XMLHttp = new XMLHttpRequest();
        contact.XMLHttp.open("GET", dataSource, false);
        contact.XMLHttp.onreadystatechange = contact.storeData;
        contact.XMLHttp.send(null);
    },

    storeData : function()
    {
        if(contact.XMLHttp.readyState == 4 && contact.XMLHttp.status == 200)
        {
            contact.XMLDoc = contact.XMLHttp.responseXML;
            contact.TXTDoc = contact.XMLHttp.responseText;
        }
    },

    displayData : function(elementID)
    {
        if(contact.TXTDoc != null)
            document.getElementById(elementID).innerHTML = contact.TXTDoc;
        else{
        document.getElementById(elementID).innerHTML = "can't do it";
        }
    }
}
  • 次のようにhtmlドキュメントにインポートします。

    <head>
        <script type="text/javascript" src="contact.js"></script>
    </head>
    
  • そして、次のように使用します。

    <body id="para">
    
    <script type="text/javascript">
        contact.getData("http://localhost/~olatunjigbadamosi/Books/contact.txt");
        contact.storeData();
        contact.displayData("para");
    </script>
    

4

2 に答える 2

3

非同期のため、テキストファイルへのHTTPリクエストに時間がかかるため、コールバックcontact.storeDataは AFTER を呼び出しますcontact.displayData

解決策は、単純に storeData 内で呼び出して、テキスト ファイルへの HTTP 要求を作成し、txtDoc プロパティを入力した後に起動することです。

storeData : function()
{
        if(contact.XMLHttp.readyState == 4 && contact.XMLHttp.status == 200)
        {
                contact.XMLDoc = contact.XMLHttp.responseXML;
                contact.TXTDoc = contact.XMLHttp.responseText;
  contact.displayData("para"); 
        }
},

私のために働く完全なコード:

<p id="para"></p>
<button id="foo">go</button>
<script>
var contact =
{
        XMLHttp : null,
        XMLDoc : null,
        TXTDoc : null,

        getData : function(dataSource)
        {
                contact.XMLHttp = new XMLHttpRequest();
                contact.XMLHttp.open("GET", dataSource, true);
                contact.XMLHttp.onreadystatechange = contact.storeData;
                contact.XMLHttp.send(null);
        },

        storeData : function()
        {
                if(contact.XMLHttp.readyState == 4 && contact.XMLHttp.status == 200)
                {
                        contact.XMLDoc = contact.XMLHttp.responseXML;
                        contact.TXTDoc = contact.XMLHttp.responseText;
              contact.displayData("para"); 
                }
        },

        displayData : function(elementID)
        {
                if(contact.TXTDoc != null)
                        document.getElementById(elementID).innerHTML = contact.TXTDoc;
                else{
                document.getElementById(elementID).innerHTML = "can't do it";
                }
        }
},
button = document.getElementById('foo');
button.onclick = function() {
    contact.getData("http://localhost/file.txt");
    contact.storeData();
};

</script>
于 2009-10-04T03:50:28.690 に答える
1

これを同期的に行う場合:

contact.getData("http://localhost/~olatunjigbadamosi/Books/contact.txt");
contact.storeData();
contact.displayData("para");

getDataが呼び出されると、リクエストが送信されて返され、終了後に getData が返され、storeData と displayData が実行されます。非同期にすると、getData はリクエストを開始し、すぐに戻ります。次に、準備が整う前に storeData と displayData が呼び出されるため、機能しません。リクエストの結果はまだ返されていません。

meder が言うように、それを修正するには、コールバック関数で表示を行う必要があります。これにより、displayData が実行されたときに、リクエストの結果を利用できるようになります。

于 2009-10-04T03:54:03.827 に答える