2012-02-10 4 views
1

'tjekdet'という名前の関数から文字列を返そうとしていますが、未定義の文字列は返されません。文字列を返すだけで済むので、$(this)に結果を追加できます。jQueryは.each()の関数から未定義の文字列を返しています

私がこのようにするのは、test2.phpの要求が約40秒かかっているからです。その代わりに、私はむしろ1つずつ実行したいと思います。しかし、それは気にしないでください。

これは同期呼び出しと関係がありますか?それとも、本当に基本的なものが完全に欠けているのですか?

function tjekdet(name) { 
    $.get("test2.php", { test: name }, 
     function(data){ 
     // alert(data); returns correctly in the alert 
     return data; 
     }); 
    } 

    jQuery(function($) { 
     $('.button').live("click",function() { 
      $(".navn-list").each(function() { 
       var navn = $(this).text(); 
       var tester = tjekdet(navn); 
       alert(tester); // returns undefined 
      }); 
     }); 
+1

tjekdetの結果は、あなたがあなたの質問で示唆しているように '$ .get'が非同期的に実行されているので' $ .get'を呼び出した結果にはなりません。 – osahyoun

+0

この質問は毎日現れますが、私はそれが重複として閉じるために必要なときに私は決して見つけることができません。 –

答えて

4

これは、同期呼び出しとは何かを持っていますか?

はい。さて、実際にはと非同期のが必要です。 tjekdet関数は、AJAX getが何かを返す前にundefinedを返します。

成功コールバックの内側にアラートを入れて:あなたが代わりにjQuery.getjQuery.ajaxを使用してfalseasyncオプションを設定することができ

$.get("test2.php", { test: name }, function(data) { 
    alert(data); 
    //Do whatever you need to do here, not in the other function 
}); 

、それはめったに良いアイデアだんとなるまで完全にブラウザをロックする傾向がありますデータが返されました。

+0

よかった、ありがとう。しかし!アラートは「はい」、「いいえ」、「はい」などのようにそれぞれ返されます。しかし今、特定のdivにその文字列を追加したいのですが、何らかの理由で '$(this).append(data); 'を使用できません。 – nielsiano

+0

'div'を' tjekdet'関数に渡すことをお勧めします。その引数を使って参照することができます。たとえば、 'function tjekdet(elem){...}'とします。関数内で要素の名前を渡すのではなく、その要素の名前を取得できます。後で更新するには 'div'への参照があります。 –

+0

ありがとうございます:) – nielsiano

0

tjekdet()は実際に何も返さないためです。 tjekdetのreturn文は実際には匿名のコールバックに属し、tjekdetの返事とは関係ありません。

さらに、tjekdet内のコールバックは非同期に呼び出されるため、alert(tester);を呼び出すと、まだ実行されていない可能性があります。

1

getは、特定のオプションセットのajaxの省略形です。 AJAXは非同期です。これは、関数が完了した時点で要求がまだ返されていないことを意味します。

getからそのような何かを返す唯一のオプションは、応答を待っている間にブラウザがハングするように、ほぼすべての場合には悪い考えで同期呼び出し、作ることです。

代わりに、コールバックでリクエストの結果を処理する必要があります。

0

これはあなたのコードは次のようになります方法です:あなたのAJAX呼び出しが非同期であり、その呼び出しが完了したときに、いくつかのアクションを実行することができます...しかしtjekdetはすぐに戻りますので、tjekdet

function tjekdet(name, callback) { 
    $.get("test2.php", { test: name }, 
     function(data){ 
      callback(data); 
    }); 
} 

jQuery(function($) { 
    $('.button').live("click",function() { 
     $(".navn-list").each(function() { 
      var navn = $(this).text(); 
      tjekdet(navn, function(data){ 
       alert(data); 
      }); 
     }); 
    }); 
}); 

tjekdetから正しい値を得ることは期待できませんが、代わりにコールバックメソッドを呼び出す必要があります。

関連する問題