0

如何将在 ajax 函数的成功回调中计算的变量传递给 document.ready ?

我有这个代码

 function loadActions()
        {
            var countDiv;


            $.ajax({
                type: "POST",
                cache: false,
                url:"modules/actions/actions.php",      

                success : function (data) {



                    $("#actions-container").html(data);
                    $('.action-details').hide();
                    countDiv = $('.action-tab-odd').length + $('.action-tab-even').length ;



                }

            });

            return countDiv;
        }

   $(document).ready(function(){



        var count = loadActions();


   });

但是计数总是未定义的。我怎样才能让它工作?

谢谢

4

5 回答 5

2

你不能 -$.ajax是异步的。这意味着$.ajax即使您进行的调用需要很长时间,您在调用后的代码也会被处理。

退货显然不是一件可以做到的事情。

但是,您可以在使用您的值完成后调用回调success函数,以便对其进行处理。或者直接在你的success方法中使用它。如果您直接需要数据,请不要使用$.ajax和创建正确的代码服务器端。

于 2012-10-01T15:39:43.123 回答
1

此代码是异步的,因此您会得到延迟的结果。与此同时,任务var count = ...已经完成。您需要一个设置变量的回调函数。

尝试这个:

var count;

loadActions(function(value){count = value});

和你的 loadActions 函数:

function loadActions(callback){
   ...

   success : function (data) {
      callback(countDiv);

请参阅此处的示例(我用超时替换了调用,但实际上是相同的)

如果这不符合您的目的,您仍然可以将 ajax 请求切换为同步:

$.ajax({
    async = false
});
于 2012-10-01T15:42:10.643 回答
1

这是异步调用,ready 的执行可能在调用成功方法之前完成,因此创建一个新函数并将成功的值传递给该函数

success : function (data) {

       $("#actions-container").html(data);
       $('.action-details').hide();
       countDiv = $('.action-tab-odd').length + $('.action-tab-even').length ;
       MyCounting(countDiv);

  }

function  MyCounting(count)
{

}
于 2012-10-01T15:39:01.503 回答
0

$.ajax默认情况下对请求的 url 进行异步调用,这意味着可能会在调用成功回调函数之前到达该return countDiv;行。

一种解决方案是通过添加async = false选项使该 url 调用同步:

$.ajax({
    // ...
    async = false,
    // ...
});

如果这适合您,请不要忘记 url 调用不再是异步的......

于 2012-10-01T15:45:11.270 回答
0

尝试这样的事情:

function loadActions()
    {
        var countDiv;

//您要考虑返回的内容 //下面,您将 ajax 对象作为函数结果返回。在您的示例中,您在一个不返回值的函数中返回一个超出范围的变量(您的成功函数不返回值)-> 见下文。

      return $.ajax({
            type: "POST",
            cache: false,
            url:"modules/actions/actions.php",      

            success : function (data) {
                $("#actions-container").html(data);
                $('.action-details').hide();
                return $('.action-tab-odd').length + $('.action-tab-even').length ;
            },
            error: function (){
                return false;
            }

        });
    }

//如果你不想在ajax调用中检查错误,你可以省略错误调用,并且在成功语句的return之前,你可以包含一个条件来检查$('.action-tab-奇数') 值设置正确 - 类似于:

if(typeof $('.action-tab-odd').length !== "undefined" || $('.action-tab-odd').length !== 0)
  {
     return false;
  } 
return $('.action-tab-odd').length + $('.action-tab-even').length

//然后在document.ready上

$(document).ready(function(){

        if(loadActions()){
            var count=loadActions();
            console.log(count);
        }


         })

还有其他方法可以做到这一点,利用 $.Deferred (我自己一直在努力解决这个问题),但这种方式似乎最接近你想要完成的事情。

于 2012-10-01T15:51:12.747 回答