2009-05-29 11 views
0

それが来るとき、私は合計noobのだ(新しい質問を作成することを意味しますが、答えは意味をなさないことを十分old oneを改訂し、新しい問題がありますしませんでした)このjQuery関数が正しく機能しないのはなぜですか? (改訂)

jQueryに、私は学びたいと思っています。私はここで間違っていますか?

function MakeCall(url) { 
var result; 
$.ajax({ 
    url: url, 
    dataType: "text", 
    success: function(txt) { 
     result = txt; 
     alert(result); 
     return; 
    } 
}); 
alert(result); 
return result; 
} 

私の問題は、最初の警告が正しい値を返しますが、2番目のアラートは「未定義」戻っていると、それは結果が成功の機能に正しく設定取得されていても、最初の警告前にポップアップするということです。 ..一息...私は間違って何をしていますか? :(

おかげでそんなに...

+0

また、非同期的に起きているので、返す前に値を取得するにはどうすればいいですか? – Jason

+0

回答をもう一度お読みください。いくつかの人々があなたに正しい答えを与えました –

+0

なぜそれが起こっているのか理解しています...私はそれを防ぐ方法を理解していません... – Jason

答えて

3

jQueryのAJAX機能は非同期である - 。Ajaxの方法がある前に、したがって、第二のアラートが実行され後に成功関数が呼び出されますそれは、関数から返されますあなたは本当にこの方法アプリを構築したい場合は完了。

は、あなたはfalseに設定し、通話に非同期オプションを追加することができます。(http://docs.jquery.com/Ajax/jQuery.ajax#optionsを、最初のエントリを参照してください。)これが成功の機能になります$ .ajaxメソッドが戻る前に呼び出されます。

しかし、スクリプトとブラウザをハングするので、ブッキングajax呼び出しを行うことはお勧めできません。

function MakeCall(url, callback) { 

$.ajax({ 
    url: url, 
    dataType: "text", 
    success: callback 
}); 

} 

MakeCall('http://theurl.com', function(txt) { 
     result = txt; 
     alert(result); 
     return; 
}); 
0

Ajaxは非同期であり、そしてそれは流れをブロックしません:

したがって、私は、次のようなアプリケーションを再構築することをアドバイス。だから、それは次のように動作します。

  • あなたは$アヤックスを呼び出し、要求がサーバー
  • に送信されたコードは$アヤックスコールの後、アラートに進み、それはまだ、要求の結果を完了していないので、変数はしばらくまだ
  • 未定義で、要求が

を終え、成功関数のアラートが結果と呼ばれているjQueryのは、あなたが要求同期を行うために使用することができ旗を持っていますが、それは、通常は悪いと考えられていますこれを行う練習。

2

XHRを使用しているときに「待機中」という素晴らしい概念はありません(OK、それを同期させることはできますが、ブラウザを激しくロックします)。その代わりに、関数をjavascriptのパラメータとして簡単に渡すことができるという事実を利用します。

ここで重要なのは、あなたが定義した「成功」機能は、呼び出しがサーバーから戻ってくるまで実行されないことです。しかし、残りのjavascriptは、あなたが見ている未定義のアラートを引き起こしますこの関数を呼び出したコードを実行するなど)。

関数からデータを返す代わりに、データが到着したときに関数呼び出し側に警告する必要があります。あなたは、サーバー要求が完了したときに呼び出すために、二番目のパラメータを追加することによって、その機能の操作を行うことができます

function MakeCall(url, functionToRunWhenDataArrives) { 
    $.ajax({ 
    url: url, 
    dataType: "text", 
    success: functionToRunWhenDataArrives 
    }); 
} 

MakeCall('myurl.com', function(txt){ 
    // do stuff with txt here! 
}); 

これはあなたが非同期リクエストを行い、いつでもに従う必要がありますパターンの種類です。

関連する問題