2012-03-15 13 views
0

私はXMLHttpRequestというコードを持っています。サーバーにリクエストを送信するオブジェクトです。非同期なので、レスポンスを受け取るには、このオブジェクトのonreadystatechangeプロパティにコールバック関数を提供する必要があります。非同期関数を通常のように動作させる方法は?

function send() 
{ 
    XMLHttpRequest req = new... 
    req.onreadystatechange = answer; 
} 

function answer() 
{ 
    //handling the answer... 
} 

をだから、素晴らしいことだが、私は匿名それを行うように答える処理するための新しい機能を使用しない:この機能は、応答が受信された後に呼び出され

function send() 
{ 
    XMLHttpRequest req = new... 
    req.onreadystatechange = function() 
    { 
     //handling the answer... 
    }; 
} 

をしかし、今私が欲しいですたとえば、結果を表示するためにsend関数の結果を別の関数で使用する場合:

display(send()) 

このようにするにはどうすればいいですか?次のようなものがあります:

function send() 
{ 
    XMLHttpRequest req = new... 
    req.onreadystatechange = function() 
    { 
     //handling the answer... 
     return result; //where result is returned by send function 
    }; 
} 

このコードは応答を処理する間に他のJSコードが動作するようにこれを行う方法はありますか?

+0

[同期XmlHttpRequestのをシミュレート]の可能な重複(http://stackoverflow.com/questions/1809931/simulating-a-synchronous -xmlhttprequest) –

+0

+ Andrew Marshall同じではありません。 –

答えて

1

非同期関数を使用する場合は、逆の方法で行う必要があります。代わりにdisplay(send())を言うのあなたはdisplay(send())が動作しません書き込もうとしましたsend(display)

function send(callback) 
{ 
    XMLHttpRequest req = new... 
    req.onreadystatechange = function() 
    { 
     //handling the answer... 
     callback(result); 
    }; 
} 

を訴えるする必要があります。 send()関数は値を非同期に生成しますが、すぐに戻ります。非同期操作の結果を返すことはできません。

0

readystatechangeハンドラの内部では、応答はreq.responseTextで利用できます。あなたはそのイベントハンドラの中にdisplay()に電話をかけてください。

0

あなた同期AJAX呼び出しを使用することができます

XMLHttpRequest req = new... 
var result = null; 
req.onreadystatechange = function() { 
    if (req.readyState == 4) { 
    if (req.status == 200) { 
     result = req.responseText; 
    } 
    } 
}; 
req.open('GET', url, false); //async = false 
return result; 

をしかし、これは貧しい人々の練習ではなくJavaScriptでの作業の慣用的な方法です。 Synchronous and asynchronous requestsを引用:

注:同期要求を使用している場合によるネットワーキングの本質的に非同期性を、様々な方法でメモリやイベントがある、ので、あなたがXMLHttpRequests同期を使用してはならないことは漏れることができます。

あなたはなぜ、単純に、コールバックを使用する方法を知っている:

send(display) 
+0

私は同期XHRを使用することを提案しません - それは悪い練習よりも悪いです(http://stackoverflow.com/a/7337091/201952)。 – josh3736

関連する問題