2011-01-11 7 views
0
function vote_helper(content_id, thevote){ 
      var result = ""; 
      $.ajax({ 
       type:"POST", 
       url:"/vote", 
       data:{'thevote':thevote, 'content_id':content_id}, 
       beforeSend:function() { 
       }, 
       success:function(html){ 
         result = html; 
       } 
      }); 
      return result; 
     }; 

結果を返信したいと思います。しかし、それは空の文字列を返しています。JQueryで何かを返すには?

+0

返品は?関数vote_helperから?あなたはできません、POSTはまだ完了していません。 – Malvolio

+7

ああああ、別の "どのように私は非同期関数から戻る"質問。 –

+1

@Jacob、それは十分だけど。問題が非同期であっても知らないと、何を検索するのかを知ることは難しいです。 –

答えて

2

短い答え、あなたがすることはできません。

長い答えでは、.ajaxは値を返すためにコールバックを使用します。これは、値がreturnが発生するまでにすでに返されている場合とされていない場合があることを意味します。しかしどちらの方法でも、別の状況でそうしています。

このシミュレーションで値を返すようにするには、関数にajaxコールバックを置き換える新しい引数を追加します。以下のような何か:

function vote_helper(content_id, thevote, callback){ 
    var result = ""; 
    $.ajax({ 
     type:"POST", 
     url:"/vote", 
     data:{'thevote':thevote, 'content_id':content_id}, 
     beforeSend:function() { 
     }, 
     success:callback 
    }); 
    return result; 
}; 

vote_helper(x,y,function(html){ 
    result = html; 
}); 

しかし、回避策かどうか、返信が関数を呼び出すコードと同じ作業パスになることはありません。あなたは応答を待ち、そこから処理を取り上げる必要があります。

+0

コールバックの 'result'は、' vote_helper'の外に*宣言しない限り、 'vote_helper'関数の' result'変数にアクセスすることができません。つまり、グローバル変数を作成することになります。 – user113716

1

あなたはAJAX呼び出しを作っているので、あなたがsuccessコールバックでAJAX呼び出しの結果を処理する必要があります。

function vote_helper(content_id, thevote){ 
      $.ajax({ 
       type:"POST", 
       url:"/vote", 
       data:{'thevote':thevote, 'content_id':content_id}, 
       beforeSend:function() { 
       }, 
       success:function(html){ 
       /* Do something like call a function with html */ 
       } 
      }); 
     }; 
1

関数が終了するまでにajaxが完了しないため、結果を返すことはできません。代わりに、コールバックを受け入れるように機能を変更し、結果とそのコールバックを呼び出す必要があり:

function vote_helper(content_id, thevote, callback) { // extra callback argument 
    $.ajax({ 
     type: "POST", 
     url: "/vote", 
     data: {'thevote':thevote, 'content_id':content_id}, 
     beforeSend: function() {}, 
     // Point directly to the callback here 
     success: callback 
    }); 
}; 
0

あなたは、サーバーの応答を待っている間にUIが完全に応答しないようにしたい場合は、次の操作を実行できます。

function vote_helper(content_id, thevote){ 
     var result = ""; 
     $.ajax({ 
      type:"POST", 
      async: false, //This line will make your code work 
      url:"/vote", 
      data:{'thevote':thevote, 'content_id':content_id}, 
      beforeSend:function() { 
      }, 
      success:function(html){ 
        result = html; 
      } 
     }); 
     return result; 
}; 

しかし、誰もUIをハングしたくないので、実際の答えは、値を返す代わりに、非同期メソッドが返ってくるときに '戻り値'を渡すコールバックを取る必要があります。

関連する問題