2017-12-25 20 views
-2

私のタイトルは私の問題に関連しているとは確信していません。コールバック機能がコールバックで

コールバック関数を呼び出す非同期関数があります。したがって、主な考え方は、 "asyncFunc"の後に関数 "dodo"を呼び出すことです。

いくつかのパターンがありますか?メモリリークに関連する問題はありますか?

var can = true; 
function dodo() { 
    if(can) 
    { 
     can = false; 
     asyncFunc(function(data) { 
      doSmth(); 
      can = true; 
     }); 
    } 

} 
setInterval(dodo, 0); 
+3

でも、 'setInterval'はそれを呼び出し続けます。おそらくより多くの実際のコードを提供する必要があります。 –

+1

'doSmth'とは' doodo 'と同じですか? – Bergi

+1

間隔以外のものを待つときには、 'setInterval'を使わないでください。 – Bergi

答えて

0

主なアイデアは、 "asyncFunc"の後に "dodo"関数を呼び出すことです。

はそうちょうどそこにそれを呼び出す:

function dodoForever() { 
    asyncFunc(function(data) { 
     doSmth(); 
     dodoForever(); // <== 
    }); 
} 
dodoForever(); 

あなたはグローバルcan状態とsetIntervalを必要としません。

+0

このようにして、私はコールスタックを増やすことに問題がありますか? – user3216941

+0

@ user3216941いいえ、asyncFuncは非同期であり、コールバックは新しいコールスタックで実行されるためです。 – Bergi

0

あなたはそれを呼び出すことができます。そのようです。

var can = true; 
function dodo() { 
    if(can) 
    { 
     can = false; 
     asyncFunc(function(data) { 
      dodo(); // this will run `dodo` function again. 
      doSmth(); 
      can = true; 
     }); 
    } 

} 
setInterval(dodo, 0); 

コメントには、スタックが吹き飛ばされます。 0秒ごとに実行されるdodoがあります。これは、基本的にはdodoというトーンを呼び出します。これは、基本的にはすべてのプログラムが実行することです。これが必要なユースケースを考えることはできませんし、パフォーマンス面ではあまりうまくいかないでしょう。

本当になぜそれを実行しようとしているのか、最終目標は何かについて考えてみましょう。

+0

しかし、警告の言葉。これはスタックを吹き飛ばすことになります。 setIntervalは0msごとに(できるだけ早く) 'dodo'を呼び出すので、最初のラウンドではドドー1回、2回目のドドーでは3回、4,5,6回... 1分以内に実行できます6000ドド以上走っている – slebetman

+0

@slebetmanあなたは100%正しいです。それにはあまり気づかなかった。今編集します。 –

+0

@slebetmanもし私がsetintervalを使わずにそれを使用して、関数dodoを(Charlie Fishの例のように)呼び出すと、メモリリークに問題がありますか?私が理解するように、機能の数は増加するだけです。 – user3216941

関連する問題