1

サーバーでAjaxリクエストを実行する機能があります。コードは機能しますが、何らかの理由で残りの js コードをブロックしています。そのため、リクエストが終了するまで待つ必要があります。ajax は本質的に非同期であるため、これは非常に奇妙です。どんな助けでも大歓迎です。

これがコードです

function initRequest(url)
{ 
    var xmlhttp = null;
    if(xmlhttp != null)
    { 
        if(xmlhttp.abort)
            xmlhttp.abort();
        xmlhttp = null; 
    };

    if(window.XMLHttpRequest) // good browsers 
        xmlhttp=new XMLHttpRequest(); 
    else if(window.ActiveXObject) // IE 
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 

    if(xmlhttp == null)
        return null; 

    xmlhttp.open("GET",url,false); 
    xmlhttp.send(null); 

    if(xmlhttp.status >= 200 && xmlhttp.status < 300)// 2xx is good enough 
    return xmlhttp.responseText.split("|"); 
    else 
        return null; 
}

そして、この関数を次のように呼び出します var res = initRequest('someurl'); if(res) { console.log(res); } console.log('このメッセージは、リクエストが処理されたときに表示されます!! なぜ??');

4

3 に答える 3

3

サーバーの応答をブロックして待つのではなく、XMLHttpRequest オブジェクトに onreadystatechange コールバックを実装し、そこでステータスの変更を確認する必要があります。このメソッドは、readyStatus プロパティが変更されるたびに呼び出され、xmlhttp.send(...); を呼び出した後、(できれば) ある時点で 200 を返します。

編集:あなたのコードは次のようになります

function initRequest(url, onsuccess, onerror) { 
    // ...
    xmlhttp.onreadystatechange = function () {
        if(this.status >= 200 && this.status < 300) {// 2xx is good enough
            onsuccess(this.responseText.split("|"));
        }
    };
    xmlhttp.open("GET", url);  // its asynchronous by default
    xmlhttp.send(null); 
}

参考までに、いくつかの役立つリンク http://www.w3.org/TR/XMLHttpRequest1/およびhttps://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest

于 2013-09-18T06:31:40.447 に答える