2009-11-21 9 views
5

別の関数が完了した後に関数を実行する方法はありますか?たとえば、次のようになります。jquery synchronous functions

doSomethingElese()はdoSomethingが完了した後にのみ実行します。これは可能ですか?

+2

あなたはすでにあなたがやりたい投稿何をしないのですか?私はここで何が欠けていますか? –

+1

+1を-1にします。この質問は他のものと同じように有効です。 – echo

+1

万が一、もっとコードを教えたり、何をしようとしているのか教えてください。 – Nosredna

答えて

7

あなたdoSomething()機能は、あなたが、むしろそれがdoSomething()戻った直後に実行することよりもその非同期要求のためdoSomethingElse()コールバックを行うことになるでしょう(たとえば、Ajaxリクエストを行うと)非同期で何かをやっている場合。

+0

これはコールバックに入れるための有効なソリューションのように見えるように、私はAjaxリクエストを作成していますが、私はコールバックの外でそれをやろうとしていました。 – ngreenwood6

-1

は、明示的にそれ自体がこれを強制する方法はありません、しかし、1つのアイデアは、doSomethingの()はdoSomethingElseは()のパラメータとして受け入れるという値を返すことです。

retval = doSomething(); 
    doSomethingElse(retval); 

その方法は、少なくともあなたから誰かを防ぎますdoSomethingElse()を呼び出して、必要な引数を少なくとも提供しなくても...もちろん、doSomething()を呼び出すことからその引数を取得するかどうかは別の問題です。しかしこれはスタートです。

アイデアが完了しました。

+5

どのように解決するかわかりません。質問が意味を成す唯一の方法は、doSomething()が非同期の処理を行っているかどうかです。戻り値と値を渡すことは、作業が完了したときには影響を与えません。 – Nosredna

6

実際には、jQueryで(少なくともある意味で)あなたが望むことができます。それは少しハッキーだと思うかもしれませんが、完璧に動作します。

他には使用しない要素をページに含めるだけです。例えばどこかの空のdiv。

<div id="syncFnHolder"></div> 

そして、+あなたの機能で私が書いrunMe機能をJSが含まれます。

function doSomething() { alert("First"); } 
function doSomethingElse() { alert("Second"); } 
function doSomethingElseThree() { alert("Third"); } 

function runMe(fn, selec) { 
    return function() { 
     fn(); 
     setTimeout(function() { 
      $(selec).dequeue("syncFnQueue"); 
     }, 1000); 
    } 
}; 

var selector = "#syncFnHolder"; 
//add three functions to a queue 
$(selector).queue("syncFnQueue", runMe(doSomething, selector)); 
$(selector).queue("syncFnQueue", runMe(doSomethingElse, selector)); 
$(selector).queue("syncFnQueue", runMe(doSomethingElseThree, selector)); 
//start first function in queue (FIFO) others are triggered automatically 
$(selector).dequeue("syncFnQueue"); 

これは、「第1」、「第2」、「第三」と言って、それらの間の1の距離で三のアラートを生成します。

遅延がないようにするには、setTimeoutを削除して、$(selec).dequeue("syncFnQueue");のままにしておきます。

パラメータにパラメータが必要な場合など。 doSomething(x,y,z)runMe関数をより良い部分にし、返された関数を別々に構築する必要があります。ここで確認するか、新しい質問を投稿してください。

javascript partial

+1

非常に興味があります – gpilotino

+2

JSオブジェクトで待ち行列とデキューを行うだけではどうですか。ダミーのDOM要素にポップするのは無意味だと思われます。 – nickytonline

+0

? jQueryを使ってどうしたらいいですか?あなたが今日のこの時(02:45 AM)に何を意味するのかはわかりません。 – jitter

2

の質問は少しあいまいです。

関数に非同期ビットがある場合は、コールバックを使用します。それが彼らのためのものです。

JavaScriptでアスペクト指向プログラミングを行う場合は、jQuery-aopをご覧ください。

3

あなたは、これを行うことができます....

function doSomething(callback) { 
    // code for do some thing 
    // now fire off the callback 
    if (typeof callback === 'function') { 
     callback(); 
    } 
} 

function doSomethingElse() { 
} 

doSomething(doSomethingElse);