2011-02-04 10 views
4

なぜ応答関数を返さないのですか?jQueryで同期リクエストを実行するにはどうすればよいですか?

function LoadBookmarksAsXml() 
{ 
    return $.ajax(
    { 
    type: 'GET', 
    async: false, 
    url: 'http://www.google.com/bookmarks/?output=xml&num=10000' 
    }).responseText; 
} 

(私は真の非同期(async)成功 - コールバック関数とのセットを定義する場合、それは働く!)事前に 感謝!!

を編集してください。クロスドメインコールは心配しないでください。 user603003は、クロスドメインリクエストが許可されているChrome拡張機能にあることを(今削除された回答のコメントに)記載しています。

ソリューション誰かが同じことをしたい場合:

return $.ajax(
{ 
    type: 'GET', 
    async: false, 
    url: 'http://www.google.com/bookmarks/?output=xml&num=10000', 
}); 

(。あなたはXMLHTTPRequestオブジェクトを取得しますが)

+3

あなたは*同期*リクエストを意味しますか? –

+0

投稿できますか?リダイレクトと何か関係がありますか? – macarthy

+0

@user:* "(あなたはXMLHTTPRequestオブジェクトを取得します)" * jQuery 1.5以降、jqXHRオブジェクトを取得します:http://api.jquery.com/jQuery.ajax/#jqxhr –

答えて

10

それはそれを返していない理由を私はすぐに見ていないんだけど、私はまだsuccessコールバックを使用したい:

function LoadBookmarksAsXml() 
{ 
    var result; 
    $.ajax(
    { 
    type: 'GET', 
    async: false, 
    url: 'http://www.google.com/bookmarks/?output=xml&num=10000', 
    success: function(data) { 
     result = data; 
    } 
    }); 
    return result; 
} 

$.ajaxが(1.4またはそれ以前のバージョンで)XMLHttpRequestオブジェクトまたはjqXHRオブジェクトを返すにもかかわらず(1.5+で)、私はまだsuccess関数と便宜のためにerror関数を使用することを好むでしょう。また、異なるバージョンのjQueryではエラー時にresponseTextの値が異なります(少なくともChromeでは1.4.4が空の文字列を返し、1.5.0はundefinedを返します)。


あなたはそれを避けることができるどのような方法がある場合、それを避けます。同期リクエストは、ほとんどのブラウザのUIを完全にロックします(あなたのページのUIだけでなく、ブラウザが管理しているすべてのタブのすべてのページ)。 Ajaxリクエストには2〜2(または5〜10)時間かかるので、これは非常に不快なユーザーエクスペリエンスになります。ほぼすべての時間、あなたはそれが結果を供給するために使用するコールバックを受け入れるように、あなたの関数をリファクタリングすることによってそれを避けることができます。

オフトピック
function LoadBookmarksAsXml(callback) 
{ 
    $.ajax(
    { 
    type: 'GET', 
    url: 'http://www.google.com/bookmarks/?output=xml&num=10000', 
    success: function(data) { 
     callback(data); 
    }, 
    error: function() { 
     callback(null); 
    } 
    }); 
} 

:リクエストが動作する場合、私は驚かれることでしょうしかし、それに直面して(あなたがGoogleで働かない限り)、そのリクエストはSame Origin Policyのために失敗します。様々なSOPを回避する方法:

  • JSONP
  • CORS(それは、ブラウザのサポートとそのwww.googleが必要です。comの機能の応答を待ってい
  • Using YQL as a proxy
+0

URLを詳しく見てください... – jAndy

+0

@jAndy oops、あなたが正しいです!これはトリックの質問ですか? :) –

+0

@jAndy:うん、私は非同期の例を追加するために戻ったときに気付いた。私は元のコードをコピー&ペーストして、 'async:false'を取り除いて、"やあ、待って、googleのURLだ! " –

1

$.ajaxが応答テキストを返すことはありません、それは常にXMLHTTPRequestをを返します。 Ajax呼び出しを行うために作成されたオブジェクト。

成功コールバックを定義する必要があります。 1つはローカル変数を設定し、次にそれを返すことができます。

標準的な免責事項:同期リクエストは、現在のページをフリーズする可能性があるため、通常はお勧めできません。

+0

ああ動作します!どうもありがとう! – ComFreek

+0

申し訳ありませんが、成功関数は必要ありません。$ .ajax();を返すだけです。あなたが説明したようなXMLHTTPRequestオブジェクトです。ありがとう。 – ComFreek

0

はasyncronousではありません)あなたの原点からの要求を許可し、それが行われたときの応答を持っていますAJAX呼び出し、あなたがして、応答の世話をする必要があり成功したイベントのコールバックを定義します。

コードを少なくとも2つに分割してください。最初の部分はajax呼び出しの前にあり、2番目の部分は成功の後にあり、成功したコールバックには、要求されたデータでやりたいことをすべて入れます。非同期要求はこのように動作します。

0

これは本当に悪い考えです。 JavascriptはHTTPリクエストの期間中ブロックされます。つまり、ajax呼び出しが返るまで、UIスレッドの何も実行されません。コールバックを使用します。

0

は設計により、非同期要求は、あなたがコールバック関数を設定し、responseTextを処理する方法を決定する必要が青;-) のうち、responseTextを配信することはできません。

関連する問題