5

sに詳しくないXMLHttpRequestのですが、Google Chrome 拡張機能のクロスオリジン機能を使っています。これはうまく機能します(必要な適切なデータを取得できることを確認できます)が、「応答」変数内に保存できないようです。

助けていただければ幸いです。

function getSource() {
    var response;
    var xmlhttp;

    xmlhttp=new XMLHttpRequest();
    xmlhttp.onreadystatechange=function() {
      if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
             response = xmlhttp.responseText;
                 //IM CORRECTLY SET HERE
        }
        //I'M ALSO STILL WELL SET HERE
    }
    //ALL OF A SUDDEN I'M UNDEFINED.

    xmlhttp.open("GET","http://www.google.com",true);
    xmlhttp.send();

    return response; 
}
4

1 に答える 1

6

onreadystatechange関数は非同期です。つまり、関数が完了する前に、後のコードの実行を停止しません。

このため、あなたはこれを完全に間違った方法で行っています。通常、非同期コードでは、onreadystatechangeイベントが発生したときにコールバックを正確に呼び出せるようにコールバックが使用されるため、その時点で応答テキストを取得できることがわかります。たとえば、これは非同期コールバックの場合です。

function getSource(callback) {
    var response, xmlhttp;

    xmlhttp = new XMLHttpRequest;
    xmlhttp.onreadystatechange = function () {
      if (xmlhttp.readyState === 4 && xmlhttp.status === 200 && callback) callback(xmlhttp.responseText);
    }

    xmlhttp.open("GET", "http://www.google.com", true);
    xmlhttp.send();
}

これsetTimeoutも非同期です。次のコードは、終了する前に 100 000 000 000 000 秒間ハングするのではなく、すぐに終了し、タイマーが起動して関数を実行するのを待ちます。しかし、それまでに、割り当てはグローバルではなく、割り当ての範囲には他に何もないため、役に立たなくなります。

function test()
{   var a;
    setTimeout(function () { a = 1; }, 100000000000000000); //high number for example only
    return a; // undefined, the function has completed, but the setTimeout has not run yet
    a = 1; // it's like doing this after return, has no effect
}
于 2013-10-06T23:55:23.273 に答える