jQuery.ajax()成功回调存储数据返回

时间:2011-11-03 12:56:06

标签: php javascript jquery ajax

我正试图从项目中的PHP脚本中获取一些数据。我发现搜索AJAX回调函数的所有示例都“使用”回调本身已有的数据,但我想获取数据并以准备好返回的方式存储它。

function getEle (id) {
    var element = []; 

    $.ajax({
        url: 'slides.php',
        type: 'POST',
        data: {"id": id},
        success: function(data) {
            var content = data;

            element[0] = id;
            element[1] = content;
            // if I alert(element[1]); here it will work! 



        }
    });
    alert(element[1]); // here it just won't :/ ("undefined")
    return element;
}

在我的脚本的某个地方,某些功能需要getEle(ments),但我得到的只是undefined。 有办法做我想要的吗?或者有更好的方法可以做到这一点吗?

5 个答案:

答案 0 :(得分:7)

解决方案是将回调函数传递给getEle()

getEle(id, callback){
  $.ajax({
    /* some options, */
    success: function(){
      var content = data;
      element[0] = id;
      element[1] = content;
      callback(element);
    }
  })
}

然后传递一个函数,其中包含元素内容时要执行的操作的代码:

getEle('myId', function(element){
  alert(element[1]);
});

答案 1 :(得分:2)

这里有两件事情失败了:

  • 可变范围 - 您可以在 AJAX回调中定义变量内容。这使得它无法从周围的代码中访问。您可以省略var,只需编写content = data即可全局访问。
  • Asynchronicity - Becaus AJAX是异步的,回调后的脚本将在执行回调之前执行。解决该问题的唯一方法是按照预期使用回调。

看看这个。

function getEle (id, callback) {
        var element = []; 

        $.ajax({
            url: 'slides.php',
            type: 'POST',
            data: {"id": id},
            success: function(data) {
                var content = data;
                element[0] = id;
                element[1] = content;

                callback(element);
            }
        });
    }
}

getEle ("someID", function(someElement) {
    alert(someElement);
});

答案 2 :(得分:1)

以下是您的代码中发生的事情:

  • 数组“element”已初始化。
  • 使用成功回调函数进行AJAX调用
  • 在等待AJAX​​运行的时候,它会继续执行其余的代码和警报元素[1],但它还不存在
  • 成功回调运行并填充数组“element”。

您可以考虑使用全局变量来解决此问题:

var element = []; 

function getEle (id) {
    $.ajax({
        url: 'slides.php',
        type: 'POST',
        data: {"id": id},
        success: function(data) {
            var content = data;
            element[0] = id;      // the global "element" is set
            element[1] = content;
        }
    });
}
// element[0] will exist now, but only after the AJAX call is complete

或者,您可以将AJAX转换为同步调用:

function getEle (id) {
    var element = []; 

    $.ajax({
        async: false,   // forces synchronous call
        url: 'slides.php',
        type: 'POST',
        data: {"id": id},
        success: function(data) {
            var content = data;
            element[0] = id;
            element[1] = content;
        }
    });
    alert(element[1]); // now it is set
    return element;
}

我能看到的唯一另一个选择是将所有内容都绑定在“成功”回调中,你已经发现它可以正常工作。

答案 3 :(得分:0)

在其余代码完成后,您的回调会执行一段时间。

您需要使用回调传递值,方式$.ajax

答案 4 :(得分:-1)

您的警报最终未定义,因为AJAX调用是异步的。因此,当AJAX调用正在等待服务器的响应时,脚本将继续执行警报,此时尚未定义element[1]

您应该将return element行放在success回调函数内。