2010-12-27 3 views
0

주기 동기화를 어떻게 만드나요? 미리 감사드립니다.사이클을 동기화하는 방법은 무엇입니까?

코드

// (...) 

object = { 
    'item1': 'apple', 
    'item2': 'orange' 
}; 

// (...) 

for(var key in object) { 

    // do something async... 
    request.on('response', function (response) { 
    response.on('data', function (chunk) { 

     console.log('The message was sent.'); 

    }); 
    }); 

} 

console.log('The for cycle ended.'); 

출력

The for cycle ended. 
The message was sent. 

내가 출력의 유형을보고 싶습니다 ...

The message was sent. 
The for cycle ended. 
+3

StackOverflow에 오신 것을 환영합니다!합리적인 방법으로 답변을 얻으려면 질문에 대한 더 자세한 정보를 제공해야합니다. 실제로, 지금과 같은 방식으로, 귀하의 질문은 지역 사회에 의해 "진정한 질문이 아닙니다"라고 결론 지을 수 있습니다. 그게 당신을 괴롭히지 않게하십시오, 단지 더 많은 세부 사항으로 다시 시도하십시오. ** 사람들은 ** 준비가되어 있으며 기꺼이 도와줍니다. 아마도 [FAQ] (http://stackoverflow.com/faq)와 [이 페이지에서 질문을 할 수 있습니다.] (http://stackoverflow.com/questions/how-to-ask). 최고, –

+0

감사합니다. T.J. Crowder. –

+0

Milo, 질문을 다시 게시하는 대신 반대로 질문을 "편집하여"자세한 정보를 제공 할 수 있습니다. – Matt

답변

5

대답이 업데이트되었습니다 :

sendMessage에 대한 호출이 동기식이므로 비동기식 기능을 호출해야합니다 (아래에서 언급했듯이). sendMessage은 NodeJS 문서에 표시되지 않습니다.

var obj, keys, key, index; 

// Define the object 
obj = { 
    'item1': 'apple', 
    'item2': 'orange' 
}; 

// Find its keys (you can just type in the array if they don't 
// need to be discovered dynamically) 
keys = []; 
for (key in obj) { 
    keys.push(key); 
} 

// Start the loop 
index = 0; 
process(); 

// This function gets called on each loop 
function process() { 
    // Are we done? 
    if (index >= keys.length) { 
     // Yes 
     console.log("The cycle ended"); 
    } 
    else { 
     // No, send the next message and then 
     // use this function as the callback so 
     // we send the next (or flag that we're done) 
     sendMessage(obj[keys[index++]], process); 
    } 
} 

원래 대답 :주기 동기가 당신은 당신이 콜백 메커니즘에서 그것을 가지고, 또는 사용하는 것이 었습니다 어떤 소스에서 그것의 동기 버전을 찾을해야합니다 . 당신은 setTimeout 또는 무언가 * * 동기화 할 수 있도록 할 것입니다.

NodeJS에 대한 호출은 동기식이 아닐 수도 있습니다. 동기 호출을 원한다면 xyzSync 버전의 호출해야합니다.

당신이 루프 * * 동기 만들고 싶어, 당신이 의미 할 수 무엇인지 추측을 계속 :

var obj, key; 

// Define the object 
obj = { 
    'item1': 'apple', 
    'item2': 'orange' 
}; 

for (key in obj) { 
    schedule(key); 
} 

function schedule(k) { 
    setTimeout(function() { 
     // Do something with obj[k] 
    }, 0); 
} 
+0

나는 내 질문을 편집 했습니까? –

+0

@Milo : 예, 답변을 업데이트했습니다. –

+0

@Milo : 죄송합니다. 업데이트 된 코드에 대해 두 가지 문제 만 말해주십시오. 결정된. –

0

내가 Node.js를 익숙하지,하지만 난 그 가정 할 것이다 :

function() { 
    console.log('The message was sent.'); 
} 

은 메시지가 성공적으로 전송되면 호출되는 콜백 함수입니다. 그리고 메시지의 실제 전송은 비동기식이므로 나머지 실행은 차단되지 않습니다. 이를 블로킹/동기식 프로세스로 만들려면 다음과 같이하면됩니다. (참고로 node.js에서 동기식 호출을 수행하는 명시 적 방법이있을 수 있습니다. 익숙하지 않습니다.)

for(var key in object) { 
    var completed = false; 
    sendMessage('Hello!', function() { 
    console.log('The message was sent.'); 
    completed = true; 
    }); 

    while(completed == false) { 
    ; // do nothing 
    } 
} 

위의 접근 방식의 단점은 sendMessage() 또는 콜백에 오류가있는 경우 while() 문에서 무한 루프가 발생한다는 것입니다.

비동기 모든 메시지를 보낼 수 있지만 다음과 같은 일을 수행하는 것입니다 이동하기 전에 모두 완료에 대기 할 또 다른 방법이 무한의 같은 문제가 것

var count = 0; 
for(var key in object) { 
    count++; 
    sendMessage('Hello!', function() { 
    console.log('The message was sent.'); 
    count--; 
    }); 
} 

while(count > 0){ 
    ; // wait until all have finished 
} 

을 count가 0에 다시 도달하는 것을 막는 오류가 있다면 반복하십시오.

관련 문제