将Success变量传递给代码

时间:2012-10-01 15:36:13

标签: jquery

如何将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();


   });

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

谢谢

5 个答案:

答案 0 :(得分:2)

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

返回某些东西显然不是一件可以完成的事情。

然而,一旦完成了你的值,你就可以在success中调用回调函数,这样它就会被处理掉。或者直接在success方法中使用它。如果您需要直接使用数据,请不要使用$.ajax并创建正确的代码服务器端。

答案 1 :(得分:1)

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

success : function (data) {

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

  }

function  MyCounting(count)
{

}

答案 2 :(得分:1)

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

试试这个:

var count;

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

和你的loadActions函数:

function loadActions(callback){
   ...

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

请参阅 example here (我用超时替换了呼叫,但它实际上是相同的)

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

$.ajax({
    async = false
});

答案 3 :(得分:0)

默认情况下,

$.ajax会对请求的网址进行异步调用,这意味着在调用成功回调函数之前,return countDiv;行可能可能

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

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

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

答案 4 :(得分: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调用中的错误,可以省略错误调用,并且在成功语句返回之前,您可以包含检查$('。action)的条件-tab-odd')值设置正确 - 像:

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(我自己也经常讨论这个问题),但这种方式似乎与你想要完成的工作最接近。