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

ajax 回调函数中的return语句是无用的。该函数是异步调用的,您不能期望任何东西将您的返回值传递给任何东西。

如果你把你的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 回答