jQuery ajax并传递返回的数据

时间:2011-03-04 10:00:10

标签: jquery ajax

我有以下代码。

这一切都有效但我将问题的数据传递给另一个变量时遇到了问题。

alert(items);,它有所需的数据,但我无法将其传递给alert(personen);

我知道它与此有关,因为请求alert(personen);执行时所需的数据不可用,但我不知道如何以合适的方式解决这个问题。

function getItems(type){
    var items;
    $.post('url' + type + '_ophalen', {},
    function(data){ 
        items = jQuery.parseJSON(data);
    });

    $(this).ajaxComplete(function() {
    alert(items);
        return items;
    });
}


var personen = getItems('persoon');
alert(personen);

2 个答案:

答案 0 :(得分:1)

我想查看数据是否存在,您应该在$ .post回调函数中执行此操作。

$.post('url' + type + '_ophalen', {},
    function(data){ // callback func
        items = jQuery.parseJSON(data);
        console.log(items);
        alert(items); // use both to see the power of console.log() ;)
    });

for jQuery< v1.5你也可以使用$ .ajax() $ .post()只是$ .ajax()...

的包装版本
$.ajax({
     type: 'POST',
     url: 'url' + type + '_ophalen',
     data: {} // no data to send ? Then why POST method instead of GET ?
     success: function(response) {
         // code for response....
         items = jQuery.parseJSON(response);
         console.log(items);
         alert(items); // use both to see the power of console.log() ;)
     }
});

P.S。如果服务器使用pain/text或`application / json

发送 JSON(作为字符串),我认为您不必使用$ .parseJSON

答案 1 :(得分:1)

问题

这是问题所在:

var personen = getItems('persoon');
alert(personen);

你的函数getItems()里面有异步功能,这意味着它以这种方式执行:

  1. 你叫它
  2. 然后异步发布内容并继续执行(不等待结果)
  3. 设置ajaxComplete功能并继续执行
  4. 它返回。
  5. 所以基本上该函数不会返回任何内容,因为它在内部异步调用完成之前完成执行。并且它没有任何返回语句来返回任何内容。

    这就是为什么它还解释了您的第一个警报什么也没有显示,第二个警告显示您的项目的行为。即使你可能认为应该先显示数据,然后再显示空数据(在功能完成执行之后)。这也可能会让你感到厌烦。

    function() {
        alert(items);
        return items;
    }
    

    return items;是此处显示的匿名函数的返回,而不是您可能想到的getItems()函数的返回。

    不推荐的解决方案 - 同步通话

    如果您想从getItems()函数返回数据,则应使用同步调用。但您只能使用$.ajax()来执行此操作,因为它支持async: false

    推荐的解决方案

    虽然可以完成同步调用我建议您使用异步调用。事情可以以不同的方式完成,但如果您使用异步调用将提供更好的体验。 Ajax应用程序在事件驱动时更好,而不是程序性的,你在这里尝试做什么。

    如果您需要在函数外部使用数据,您可以随时定义一个闭包变量(也可能是全局的,但通常不是一个好主意),它将在您的函数之外可用。

    // creating a closure
    (function(){
    
        // closure-global variable
        var personen = {
            data: null,
            available: false;
        };
    
        function getItems(type){
            $.post('url' + type + '_ophalen', {}, function(data) { 
                personen.data = jQuery.parseJSON(data);
                personen.available = true;
            });
        }
    
        getItems('persoon');
    
        // do other stuff in event-driven way
        // like when a user clicks something
    
        $("#SomeButtonOrLink").click(function(e){
            e.preventDefault();
            if (personen.available)
            {
                // do some processing
            }
            else
            {
                alert("Data not laoded.");
            }
        });
    })();
    

    所以基本上这段代码将是事件驱动的。我不知道何时应该加载项目,但它应该与某些事件相关(可能是页面加载或用户做某事)。所以一切都是由事件驱动的。加载项目(如果我们说它们应该在页面加载时加载)并且在完成后你不必处理任何事情,直到用户做某事(在上部场景中它是某个按钮或链接的点击事件)。这是事件驱动的执行。