-2

WebAPI プロジェクトのアクションからデータを取得しようとしている次の JavaScript コードがあります。私が抱えている問題は、データセット変数を使用しようとすると、データセットが未定義であるというエラーが表示されることです。また、アラート 1 が最初に発生することを期待しますが、データセットが未定義のアラート 2 が最初に発生し、次にアラート 2 が発生し、その後にデータが含まれます。ここで何が間違っていますか?

<script type="text/javascript">
    $().ready(function() {
        var dataset;
        $.get("http://localhost:9619/api/values", function(data) {
            dataset = data;
            alert("No. 1 " + dataset);
        });

        alert("No. 2 " + dataset);
    });
</script>
4

4 に答える 4

1

$.get()非同期です。したがって、コールバックの実行は、要求が終了するまで遅延されます。

この場合の実行順序は次のようになります。

1. start the get request
2. alert( "No. 2 " );
3. [request has finished] execute the callback:  alert( "No. 1 " );

$.get()リクエストに依存するすべてのコードをそれぞれのコールバックに追加する必要があります。このようにして、リクエストが成功し、変数が設定されていることを確認します。

もう1つのあまり好ましくない解決策は$.ajax()、そのasyncパラメーターを使用してfalseに設定することです。ただし、その場合、すべてのJavaScriptコードの実行は、リクエストが終了し、その間にページがフリーズするまで待機します。

于 2013-01-15T17:15:41.213 に答える
0

$ .getは「非同期」であり、続行する前に終了するのを待ちません。2番目の引数はコールバック関数です(ここに、

alert("No. 1 " + dataset);

何が起こるかはあなたが走ると

$.get("http://localhost:9619/api/values", function(data) 

それはすぐに次の行に進みます:

alert("No. 2 " + dataset);

そして、AJAX呼び出しが完了すると、実行されるコールバック関数が実行されます。

dataset = data;
alert("No. 1 " + dataset);

非同期JavaScriptに関するかなり良いプレゼンテーションがあります:非同期JavaScriptの記述101

于 2013-01-15T17:17:37.000 に答える
0

$ .get()は非同期呼び出しであるため、コントロールがそこに到達するとすぐに起動されます。また、本質的に非同期であるため、呼び出しが完了するまで待つ必要はありません。そのため、コントロールは次のアラートに移ります(そして、ajax呼び出しはまだ完了に向かっている可能性があります)。

于 2013-01-15T17:18:48.260 に答える
0

ajaxリクエストは非同期であるため、アラートNo. 2は最初に値を指定して起動する必要があります。undefinedその後No. 1、リクエストから受け取った値でアラートを受け取る必要があります。同期ajaxリクエストを使用することで期待する動作を得ることができます(悪い習慣)。

これを試して:

$().ready(function() {
    var dataset;
    $.ajax({
         url: 'http://localhost:9619/api/values', 
         success: function(result) {
                   dataset = data;
                   alert("No. 1 " + dataset);
                },
         async: false
    });
    alert("No. 2 " + dataset);
});

同期要求の場合。

于 2013-01-15T17:16:21.387 に答える