2012-02-22 7 views
2

この質問のタイトルはあまり明確ではありませんが、コードを入力せずに何を求めているのか説明できません。Javascript - 他の場所から呼び出された関数から値を返す

私は、AJAXを使用してレポート(配列)を送信するページを作成しています。私は

(私はGetXmlHttpObject()関数が問題に関連しているとは考えていない)

function saveReport(params) 
{ 
    var url="reports/save.php"; 

     xmlHttp=GetXmlHttpObject(); 
     if (xmlHttp==null) 
     { 
      return false; 
     } 
     xmlHttp.onreadystatechange=stateChanged; 
     xmlHttp.open("POST",url,true); 
     //Send the proper header information along with the request 
     xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
     xmlHttp.setRequestHeader("Content-length", params.length); 
     xmlHttp.setRequestHeader("Connection", "close"); 
     xmlHttp.send(params); 

} 

function stateChanged() 
{ 
    if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") 
    { 
     if (xmlHttp.responseText == 'complete') 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

う:私は、関数は次のようになりPHPページに配列を提出し、ライブラリに保存されてい以下のように私のページからsaveReport()を呼び出すことができるようにしたい

success = saveReport(params); 
if (success == true) 
{ 
    alert('success'); 
} 
else 
{ 
    alert('failure'); 
} 

だから関数saveReport()は、それがページように呼び出される関数のstateChanged()から返された値を返す必要があり、このsaveReport()を呼び出すことで、何をすべきかを決めることができます。異なるページで異なることがあります。これを行う方法はありますか?

私が試している方法では不可能かもしれないが、私は同じ効果に何かできることがあることを理解している。

答えて

1

独自のAjaxヘルパーを使用している理由はありますか?

このような状況では、サーバが応答したときに起動するコールバック関数が必要になります。応答が成功するか失敗するかを問わず何かを行うことができます。

明らかに、あなたはjQuery.ajaxのようなものを使うことができますが、これは何かのために過度なことかもしれません。

多くのマイクロAjaxライブラリの1つをhttp://microjs.com/#ajaxで試してみてください。

+0

私はこれを発見していませんでした。私はjqueryを使用する関数に渡される匿名関数を使用し、これらは成功または失敗時に呼び出されます。 –

0

あなたは、要求が(それの非同期)をブロックしていないので、あなたがそのようにそれを行うことができなくなります

success = saveReport(stateChanged()); 
if (success == true) { 
    alert('success'); 
} else { 
    alert('failure'); 
} 
+0

試しましたか? (これは動作しません) – jprofitt

1

を試してみました。あなたはxmlHttp.onreadystatechangeのコールバック関数としてstateChanged()を設定したのと同じ方法でコールバックを使用する必要があります。

結果を処理する新しい関数を作成し、から呼び出して、trueまたはfalseを成功として渡すことができます。

function stateChanged() 
{ 
    if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") 
    { 
     saveReportFinished(xmlHttp.responseText == 'complete'); 
    } 
    else{ 
     saveReportFinished(false); 
    } 
} 

function saveReportFinished(success) { 
    if (success == true) 
    { 
     alert('success'); 
    } 
    else 
    { 
     alert('failure'); 
    } 
} 

技術的にはあなただけstateChanged()にこのすべてを組み合わせることができ、私はそれがこのようきれいだと思います。

1非同期応答が戻ってくる前に、関数は、焼成を終了しますので、非同期操作は、関数が戻るとのトラブルを引き起こす):あなたがここに夫婦の問題を持っているよう

1

が見えます。 2)関数は、だけなので、他の関数の結果を返すための機能を得るために、あなたはこのような何かする必要があると思います、あなたはそれを言うことが返されます。)return stateChanged(args)

1への解決策を使用することですコールバックは、そのよう:

:ファイル名を指定して実行のstateChanged内部のコールバック()

function saveReport(params, callback){ 
... 
xmlHttp.onreadystatechange = function(){ 
    stateChanged(callback); 
}; 

...

function stateChanged(callback){ 
... 
callback(true); 
... 
callback(false); 

はその後、そうのようなコールバックを渡します

関連する問題