2011-04-17 9 views
1

jqueryとjavqascriptを正しく理解すると、非同期です。私が理解できないのは、それが非同期でajaxの部分だけであれば、ロードして取得するか、一般的にはすべてです。例えばjquery - 関数が終了するまで待つ

私は形式でリストメニューを追加する必要があるとしている場合:

$('#id').append("<option value='1'>1</option>") - etc., in this demo the <select id="category> is missing 

今私がしたい:もちろん

$('#category option[value="1"]').attr('selected', 'selected'); 

を私は、この値を選択したいのですが1メニューがアペアされた後、メニューがアペアされます。

私は、スクリプトが終了するまで待っていて、両方の行を次々に書き込むのは難しいですか、最初の行にコールバック関数を追加する必要があるのでしょうか?完了?

これはブラウザ上で動作しますが、高速なコンピュータを使用しているため、非同期の場合に選択を追加する前に選択しようとすると遅くなることが心配です。

または、ajaxはasynchroniusを呼び出しますか?これは明白で初心者のようなものですが、この基本的なことを突き止めるために見つけることができる良いキーワードはありませんので、ここで尋ねています。

+0

@ThiefMasterが正しい答えをくれました。私は、上記の文を書く別の方法を提供したかっただけです: '$(" ").appendTo( '#id')。attr ( 'selected'、 'selected');これはもう少し効率的です。 –

答えて

5

AJAX、setTimeout、setInterval、およびイベントハンドラのみが非同期です。他のすべては同期して実行されます。

したがって、2行目が実行されたときに1行目が実行されたと見なすことができます。

誰かが非同期で実行するかどうかを判断する良い方法は、コールバック関数を渡すかどうかを調べることです。 を実行すると、実行時間が外部要因(ネットワーク速度)に依存するか、実行に時間がかかる(たとえば要素をフェードアウトする)ことがあるので、非同期に実行する可能性があります。ただし、$.eachのようなものは、コールバック関数で動作していても同期して実行されます。しかし、その場合は、実行が人工的に遅くなったり、外部要因に依存したりするため、実行が非同期的になる理由はありません。

$('#id').append("<option value='1' selected='selected'>1</option>") 
+0

あなたの素晴らしい説明をありがとう。したがって、私の2行は低速のコンピュータでも正しく実行されます。私が書くすべての関数にコールバック関数を渡すことはできますか? – Jerry2

+0

+1または'.sort()'はコールバックとしてカスタムソート関数を取ります(しかし、これも私が想定している別のシナリオです)。 –

+0

@ Jerry2:自分で関数を書く場合は、コールバックを受け入れるようにすることができます。コールバックは特別なものではありません。これは、関数である通常のパラメータです。関数はJSのファーストクラスのオブジェクトなので、必要に応じて渡すことができます。コールバックを受け入れる関数も最終的に呼び出す必要があります。例えば。 'function foo(cb){cb( 'コールバックコール');}; foo(alert); ' –

0

繰延オブジェクトが入って来て、なぜ最新のjQueryのは最終的にそれらを持つための素晴らしいです:たとえば

$.when(appendMenu()).then 
(
function() 
    { 
    $('#category option[value="1"]').attr('selected', 'selected'); 
    } 
); 

function appendMenu() 
{ 
var dfd = $.Deferred(); 
$('#id').append("<option value='1'>1</option>"); 
dfd.resolve(); 
return dfd.promise(); 
} 

http://api.jquery.com/category/deferred-object/

概念は基本的にコードが約束ポリシーに基づいて実行されなければならないとき、あなたがコントロールすることができます - 繰延オブジェクトは、それが行われていると言うまで、他のコードが実行されることはありません。

正直言って、私はこれらの2つの呼び出しがなぜ瞬間的に起こらないのかを想像していません。私は一般に、遅延オブジェクトのない種類の呼び出しではいつも取り除くことができるので、このプロセスを遅くするいくつかの他のコードはないと確信していますか?

0

を(明示的にChromeのマルチスレッドモードを有効にしない限り)JavaScriptを実行するために単一のスレッドを使用すると言われた

+0

Thanx私はそれを知っていますが、リロード時にサーバー側の値を渡しています。選択がajaxで構築されているため、選択を生成するときに何を選択するのか分かりません。 – Jerry2

2

これは、次のとおりです。私はほとんどのブラウザは、あなたがこの方法を行うことができますまた

+0

はい、うまくいきました。遅いマシンではうまく動かないと思っていました。 – Jerry2

関連する問題