2

この混乱は頭の中で整理されたと思っていましたが、何らかの奇妙な理由で機能していません。

関数/スコープの外で変数を宣言し、関数内でvarなしで参照すると、以前に宣言された変数が変更されます...そうですか?

ただし、最初のアラートでは正しい価格が返されますが、2 番目 (最後) のアラートでは 0 が返されます。

//get pricing
var price=0;
var modelid = $("#model_input").val();
var inCode = $("#code_input").val();
$.get("getpricing.php", {  'modelid': modelid ,'code' : inCode }, function(data){
    price = data;
    alert(price);
});
alert(price);
4

2 に答える 2

8

A jax リクエストを使用しています。

それらは、特に指定されていない限り、A synchrounous です。これらは、スクリプトの残りの実行を停止することなく、バックグラウンドで実行されます。

そのためalert、Ajax リクエストが終了する前にコードの最後の行が実行されます。つまりprice、その時点ではまだ 0 です。

これを変更する 1 つの方法は、同期リクエストを使用することです ( async オプションを参照)。しかし、私は強くお勧めしません。ドキュメントを引用する:

デフォルトでは、すべてのリクエストは非同期で送信されます (つまり、これはデフォルトで true に設定されています)。同期リクエストが必要な場合は、このオプションを false に設定します。同期リクエストはブラウザを一時的にロックし、リクエストがアクティブな間はすべてのアクションを無効にする場合があることに注意してください。

そして、あなたのアプリケーションがブラウザ全体をフリーズさせたくないことは間違いありません!

この場合、アプリケーションの設計方法を再考する必要があります。「価格」情報は、Ajax リクエストが終了した後にのみ使用できます。これは、おそらく、成功時に呼び出される関数内により多くのコードを配置する必要があることを意味します。の後にコードを配置する$.getだけでは不十分です。

于 2009-08-14T04:59:40.947 に答える
3

.get を使用する httprequests は非同期であるため、最初のアラート (2 番目に宣言されたアラート) は、リクエストのコールバックがまだトリガーされていないため、元の値をアラートします。

于 2009-08-14T04:55:52.437 に答える