2014-05-06 162 views
0

当我在函数中调用函数时,它返回undefined。当函数本身被调用时,它会返回我期望它返回的数据。当从另一个函数调用时,Javascript函数返回undefined

的功能:

function companyNumbers(account_id) { 
    $.ajax({ 
     type: "GET", 
     url: "http://example.com/api/api_client_relationships/" + account_id, 
     dataType: 'json', 
     success: function(data) { 
      for(var i=0;i<data.length;i++){ 
       console.log(companyNames(data[i].company_id)); // returns undefined 
      } 
     } 
    }); 
} 

function companyNames(id) { 
    $.ajax({ 
     type: "GET", 
     url: "http://example.com/api/api_company_names/" + id, 
     dataType: 'text', 
     success: function(data) { 
      return data; // returns valid result when not called within another function 
     } 
    }); 
} 

data[i].company_id距离返回的JSON响应解析的值。它充当传递给companyNames函数的参数。

+3

异步调用不同步! – epascarello

回答

1

您试图从异步回调中返回一个值。 return data回调内部不会将数据返回给companyNames的调用者。相反,通过在回调传递给companyNames和返回数据:

function companyNames(id, callback) { 
    $.ajax({ 
     type: "GET", 
     url: "http://example.com/api/api_company_names/" + id, 
     dataType: 'text', 
     success: function(data) { 
      callback(data); 
     } 
    }); 
} 

然后companyNumbers变为:

function companyNumbers(account_id) { 
    $.ajax({ 
     type: "GET", 
     url: "http://example.com/api/api_client_relationships/" + account_id, 
     dataType: 'json', 
     success: function(data) { 
      for(var i=0;i<data.length;i++){ 
       companyNames(data[i].company_id, function(data) { 
        console.log(data); 
       }); 
      } 
     } 
    }); 
} 
+1

谢谢。我仍然在学习javascript中异步和同步调用的区别。很有帮助。 –

0

欢迎AJAX的世界里,你不能离开浏览器等待返回,作为它的异步。相反,您应该使用回调函数:

companyNames(data[i].company_id, function(info){console.log(info)}); 

function companyNames(id, call_back) { 

success: function(data) { 
     call_back(data); // returns valid result when not called within another function 
    } 
0

这是因为函数companyNames启动了一个异步进程。它在启动ajax调用后立即返回,并且它的返回值是未定义的,因为函数本身没有指定返回值,只是在ajax调用实际完成时调用的函数。