2017-12-25 33 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' 란 '도도'와 같은 것입니까? – Bergi

+1

간격 이외의 다른 것을 기다리고 싶을 때'setInterval'을 사용하지 마십시오. – Bergi

답변

0

주요 개념은 "asyncFunc"가 완료 될 때마다 "도도"함수를 호출하기를 원합니다.

그래서 그냥 호출 :

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); 

주석에 언급 된대로 스택을 날려 버릴 것입니다. 모든 0ms마다 실행중인 dodo이 있습니다. 기본적으로 dodo 번이 호출되며 기본적으로 모든 프로그램이 수행하게됩니다. 이것이 필요한 유스 케이스에 대해서는 생각할 수 없다. 아마도 성능면에서 그렇게 잘 맞지 않을 것이다.

왜 당신이 그것을 어떻게 실행하려고하는지, 최종 목표는 무엇인지 생각하십시오.

+0

경고 단어. 이것은 스택을 날려 버릴 것입니다. setInterval은 매주 0ms (가능한 한 빨리)'dodo'를 호출하기 때문에 첫 번째 라운드에는 도도 1 개가 실행되고 두 번째 라운드에는 2, 3, 4, 5, 6이 실행됩니다. 6000 dodo 이상 실행 중입니다. – slebetman

+0

@slebetman 당신은 100 % 정확합니다. 그 사실을 눈치 채지 못했습니다. 지금 편집합니다. –

+0

@slebetman setinterval을 사용하지 않고 그것을 사용하면 (예 : Charlie Fish처럼) 자체적으로 함수 dodo를 호출합니다. 메모리 누수 문제가 있습니까? 내가 알기로는 함수의 수가 증가 할 뿐이다. – user3216941