2009-05-29 14 views
1

jQueryについては、私は全然noobですが、私は学びたいと思っています。私はここで間違っていますか?なぜこのjQuery関数は正しく機能しませんか?

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

EDIT:

OK、愚かさのそのビットについて申し訳ありませんが...私はその部分を修正しました。今、私の問題は、それが今でアラートが...結果は成功機能に正しく設定取得されていても、

本当にありがとうございました...

+0

すべての回答ありがとうございました...私は本当にこれを台無しにしてしまいました。私は別の質問を投稿しました。誰も助けに戻ってこないと思いました。私は(A)JAXの非同期性を理解しています。毎回未定義ではなく、AJAXが答えを返す前に完了するまで待機する方法がありますか?私はこの関数を再利用したいです(つまり呼び出して結果を返す)ので、その中から関数を呼び出すことはできません... – Jason

答えて

3

謝罪 - 私は質問への回答を投稿するだけで、この男が本来投稿した他の質問を見ました。

Jqueryのajax関数は非同期です。したがって、の2番目のアラートが実行された後、成功関数はと呼ばれます。その後、ajaxメソッドが完了する前に関数から戻ります。

このようにアプリを実際に作成する場合は、asyncオプションを呼び出しに追加してfalseに設定することができます。 (http://docs.jquery.com/Ajax/jQuery.ajax#options、最初のエントリを参照してください)。$ .ajaxメソッドが戻る前にsuccess関数が呼び出されます。

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

はしたがって、私は、次のようなアプリケーションを再構築することをアドバイス:

function MakeCall(url, callback) { 

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

} 

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

+1私はあなたの解決が好きです –

13
result == txt; 

を「未定義」戻っているということです万一

result = txt; 

あなたの第二の問題は、AJAX呼び出しが非同期であるということであること。すなわちalert(result)ステートメントは、おそらくsuccessコールバック関数の前に実行されます。

これを防ぐ方法をお尋ねします。できません。これはバグではありません。これがAJAXの略です。 ajax呼び出しの後に何かを実行したい場合は、それをsuccessコールバック関数に追加します。

編集

あなたは本当に結果は、あなたがこれを行うことができますいくつかの他の機能で処理する必要がある場合:

$.ajax({ 
    url: url, 
    dataType: "text", 
    success: function(result) { 
     someOtherFunction(result) 
     return; 
    } 
}); 
+0

ajax呼び出しの結果を返す方法はないのですか?どういうわけか、私はそれが信じがたいことが分かりました.... – Jason

2

JavaScriptで代入演算子は=

result = txt; 
2
です

の結果はに何も割り当てられていないので、秒は未定義に戻ります。他の人が、

変更それ

result= txt; 

結果に言うように== txtのは、第二の問題があるためである

編集 -

を割り当てることがない、比較する方法がありますjavascriptは、アラートを送信する前にajaxが終了するのを待つことはありません。 ajaxのAはを表します。非同期は、ajax関数が終了するのを待たずに実行されます。

2

これは、AJAXが送出された直後にアラートが発生しているために発生しています。 AJAXは非同期なので、要求をディスパッチするだけでは結果を取り込むことができません。

メッセージボックスを成功関数内に配置するか、成功関数内から関数を呼び出します。

3

は、私はそれはjavascriptのサーバー呼び出しの非同期性によるものだと思う:JavaScriptは、あなたが警告を行うときに、おそらくAJAX呼び出しがまだ返すようにしている)(アラートに進む前に応答を待つ

2

を呼び出すことはありません。 ?

正常に機能しているかどうかをテストするために、成功関数にアラートを入れてみてください。

1

$アヤックス()関数は、デフォルトでは非同期である(それはAJAXでAです)ので、アラートはAJAXコールバック関数の前に起こります完了です。値を返す関数が必要な場合は、asyncオプションを使用します。関数が完了するまで、それは非同期に実行し、他の人が述べたように、成功コールバック関数で結果を使用できるようにする方が良いことができますので、もし、ブラウザがフリーズします

$.ajax({ 
    async: false, // disable asynchronous ajax 
    url: url, 
    dataType: "text", 
    success: function(txt) { 
     result = txt; 
     return; 
    } 
}); 

関連する問題