0

XHR の onreadystatechange 関数内にいる場合は簡単に実行できますがdocument.title = xhr.responseText、関数が responseText を返すようにすると、XHR の外側のラッパーと等しい変数を設定して応答と等しくすることはできません。これを行う方法はありますか?

私のラッパー:

ajax = function(url, cb)
 {
    xhr = (window.XMLHttpRequest)
        ? new XMLHttpRequest()
        : new ActiveXObject('Microsoft.XMLHTTP');
    xhr.onreadystatechange = function()
     {
        if (xhr.readyState == 4 && xhr.status == 200)
         {
            cb(xhr.responseText);
         };
     }
    xhr.open('get', url, true);
    xhr.send();
 };

今、私が次のようなことをしたとします:

ajax('bacon.txt', function(_)
 {
    document.title = _;
 }

それは絶対に完璧に機能します。実際、document.title は bacon.txt への呼び出しの responseText になります。ただし、この方法で実装しようとすると、次のようになります。

document.title = ajax('bacon.txt', function(_)
 {
    return _;
 }

そのような運はありません。これがなぜなのか、誰かが明確にすることはできますか?};

4

2 に答える 2

7

ajax関数のリターンをタイトルに割り当てています。ajax 関数自体は何も返しません。

AJAX の要点は、応答が受信される前に、関数がサーバーに要求を行った直後に戻ることです。title プロパティに undefined を割り当てています (ところで、私は通常 ajax 関数に使用中の xhr を返させ、必要に応じて中止できるようにしています)。

リクエストが完了すると、コールバック(コードの cb )関数が呼び出されるため、元のコードは意味があり、割り当てを行います。

于 2009-03-06T21:26:37.523 に答える
0

onreadystatechange 関数の結果は、「ajax」関数と同じではありません...投稿を同期させて、ajax 関数が同じものを返すようにすることもできますが、応答に時間がかかる場合、ブラウザでのユーザー応答が遅くなります。長すぎる。

あなたができるより良いのは、あなたが好むように、それを行う別の方法を見つけることです. つまり、悪化するので、そのように機能させようとしないでください。

于 2009-03-06T21:31:05.127 に答える