2012-12-19 146 views
0

我有解析JSON的这个函数。当我在.live函数中调用它时,我得到了undefined。调用函数时未定义

这里是我简单地调用这样的,我已经创建了功能,

function getAbc() { 
        var details; 
        var id = $(this).attr('data-id'); 
        $.ajax({ 
         url : '/index.php/data', 
         type : 'GET', 
         data : 'persons[]=' + id, 
         success : function(data, textStatus, xhr) { 
          details = JSON.parse(data); 
         }, 
        }); 
        return details; 
       } 

,getAbc()。有没有什么办法可以访问函数中的细节变量?

+0

'$ ajax'有一个回调的原因。它是异步的。 – 2012-12-19 19:10:23

+0

也可以使用'getAbc.call(this)'而不是'getAbc()'将上下文从调用函数绑定到'getAbc' – Musa

回答

2

使用延续传球风格。 $.ajax本质上是异步的。

function getAbc(callback) { 
    var details; 
    var id = $(this).attr('data-id'); 
    $.ajax({ 
     url : '/index.php/data', 
     type : 'GET', 
     data : 'persons[]=' + id, 
     success : function(data, textStatus, xhr) { 
      details = JSON.parse(data); 
      callback(details); 
     } 
    }); 
} 

function getAbc(function (details) { 
    console.log(details); 
}); 
+0

我可以使用类似console.log(getAbc()。details)的东西吗? – user1890338

+0

@ user1890338 - 您可以将处理详细信息的逻辑放在第二个函数中。然后你会直接调用第一个函数。 (我相信函数应该有不同的名字,但我可能是错的 - 我远离JavaScript专家。如果是这样的话,我会重命名第二个函数_processDetails()_以便清楚。) – jahroy

+0

我有一个.live功能。我想在那个中使用它 – user1890338

1

这是因为ajax发生异步。这意味着getAbc返回之前success被调用,因为请求通过电线。您需要在success回调中使用details,而不是在getAbc方法返回后使用。或者,在success中调用另一种使用详细信息的方法,并将details传递给该方法。

1

这是由于AJAX的工作原理。

AJAX请求是异步的,这意味着它们不会立即返回。

当您进行AJAX调用时,会在未知的时间完成请求。

您可以使用回调函数来处理结果。

回调函数是执行的函数AFTER从AJAX请求收到响应。

您可以指定回调函数并将其传递给您的AJAX调用。

+0

那么我该如何返回它呢? – user1890338

+0

请参阅@kadaj的答案 – jahroy