2

Javascriptが非同期であることは知っていますが、この場合、何が起こるのかわかりません。

以下の27行目で、関数「GetProducer」を呼び出します。この関数は、後で使用することを目的とした特定のプロデューサーのデータを返すことになっています。ただし、それを統合すると、データが取得される前に28行目のコードが実行されるため(27行目)、未定義になります。

どうしてこれが起こり、それを解決するために何ができるでしょうか?

1.     function GetProducer(id) {
2.  
3.          $.ajaxSetup ({
4.            url: "http://localhost/api/v1/producers/" + id,
5.            type: "GET",
6.            dataType: "json",
7.            cache: false,
8.            contentType: "application/json"
9.          })
10.         $.ajax({
11.             success: function(data){
12.                 return data;
13.             },
14.             error: function(xmlHttpRequest, textStatus, errorThrown) {
15.                 console.log(xmlHttpRequest);
16.                 console.log(textStatus);
17.                 console.log(errorThrown);
18.            }
19.         }).done(function(data){
20.             console.log(data);
21.         })
22.      }
23.
24.     $('.modal-btn').click(function(){
25.         var producerId = $(this).attr('id');
26.         $('#myModalLabel').html(producerId);
27.         var info = GetProducer(producerId);
28.         console.log(info); // <--- undefined
29.     });
4

1 に答える 1

5

returnajaxコールバック関数内のステートメントは役に立ちません。この関数は非同期で呼び出され、戻り値が何かに渡されることは期待できません。

「success」コールバック内console.log()に呼び出しを入れると、値が表示されます。

「GetProducer」関数もコールバック引数を取るように変更する必要があります。

    GetProducer(producerId, function(info) { ... });

この場合、関数は多かれ少なかれ次のようになります。

  function GetProducer(producerId, callback) {
    $.ajaxSetup({
      // ... same
    });
    $.ajax({
      success: function(data) {
        callback(data);
      },
      // etc
    });
  }

したがって、コールバック関数は、「プロデューサー」情報を処理するコードを配置する場所になります。非同期プログラミングとは、結果が利用可能になったときに結果を処理するAPI関数を提供することです。

于 2012-12-15T23:17:15.557 に答える