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ただし、値が処理されたら、callbackfunctionを呼び出すことができます。または、successメソッドで直接使用します。$.ajaxデータを直接必要とする場合は、適切なコードサーバー側を使用および作成しないでください。

于 2012-10-01T15:39:43.123 に答える
1

このコードは非同期であるため、結果が遅れます。その間に、割り当てvar count = ...はすでに完了しています。変数を設定するcallbackfunctionが必要です。

これを試して:

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

これは非同期呼び出しであり、successメソッドが呼び出される前に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)
{

}
于 2012-10-01T15:39:01.503 に答える
0

$.ajaxデフォルトでは、要求されたURLに対して非同期呼び出しを行います。これは、成功コールバック関数が呼び出される前に、おそらくreturn countDiv;その行に到達することを意味します。

async = false1つの解決策は、次のオプションを追加して、その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呼び出しでエラーをチェックしたくない場合は、エラー呼び出しを省略できます。また、successステートメントで戻る直前に、$('。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を利用してこれを行う方法は他にもありますが(私はこの問題にかなり苦労しています)、この方法はあなたが達成しようとしていることに最も近いようです。

于 2012-10-01T15:51:12.747 に答える