2012-02-13 4 views
1

대용량 스크립트가 매우 동기화되어 있습니다.JavaScript : 동기식으로 다시 시작하는 비동기 함수

var result = doSomethingSynchronous(myVar); 
if (result === 'something') { 
    doSomethingElse(); 
} 

doSomethingSynchronous 기능을 갖는 if 문에 값을 반환 for 루프 :

1)는이 같은 기능을 실행

var i = 0; len = someVariable.length; 
for (; i < len; i++) { 
    if (someVariable[i] === 'aString') { 
    return true; 
    } else { 
    doSomethingElse(); 
    } 
} 

이 때문에 루프 처리를위한 강렬해질 수 있습니다, 나는 배열에서 하나의 요소를 이동 한 후 setTimeout을 사용하여 비동기 적으로 실행되는 반복 큐 처리 함수로 for 루프를 대체했습니다. 비동기 적으로 실행되면 물론 값을 반환하지 않고 첫 번째 스 니펫의 '결과'변수에 동 기적으로 할당합니다. if 문은 항상 실패합니다. 제 질문은이 부분을 동기식으로 유지하는 방법이 있습니까? 스크립트가 다음 줄로 넘어 가기 전에 결과에 값을 할당 하시겠습니까? 아니면 비동기 함수가 완료되었음을 알리기 위해 observer/mediator 패턴 또는 유사한 것을 사용해야합니까?

또는 콜백을 사용할 수도 있지만 실제 실제 코드는이 코드보다 길어서 모두 동시성에 달려 있습니다. 따라서 var result = doSomethingSynchronous()를 비동기로 전환하면 나머지 동기 스크립트에도 도미노 효과가 발생합니다. 맞습니까? :-) 이것은 어렵고 오류가 발생하기 쉬운 변환으로 들리므로 조언을 구하는 것이 좋습니다.

감사합니다.

- 변수 이름 "le"을 수정하기위한 UDPATED. "len"이어야합니다.

답변

0

결과를 값에 할당하려면 기능을 타이머에 연기하는지 여부와 관계없이 콜백을 전달하고 값을 반환하는 대신 호출해야합니다 .

function doSomething(someVariable, callback){ 
    var i = 0; len = someVariable.length; 
    for (; i < len; i++) { 
    if (someVariable[i] === 'aString') { 
     callback && callback(true); 
     break; 
    } else { 
     setTimeout(function(){ deferredSomething(callback); }, 10); 
    } 
    } 
} 

function deferredSomething(callback){ 
    /* code.. */ 
    callback && callback('something'); 
} 

doSomething(myVar, function(result){ 
    if (result === 'something') { 
    doSomethingElse(); 
    } 
}); 

나는 또한 당신이 강렬한 무언가를하고 있다면 당신은 배경 스레드에 오프로드 할 수 있도록, 당신은 확실히 당신이 단지 파이어 폭스와 협력하고 특히, 웹 노동자를 보라 언급 것이다 부가 기능 .https://developer.mozilla.org/En/Using_web_workers

--UPDATED 예 CODE 해결하기 (수정을 변수 "제작"는 "LEN"이어야 함)

관련 문제