2012-11-28 3 views
0

이 주제에 관한 몇 가지 질문은 stackoverflow에서 읽었지만 그 중 아무 것도 내 의구심에 대답하는 것 같지 않습니다.JavaScript async non-blocking functions without process

var async_function = function(val, callback){ 
    process.nextTick(function(){ 
     callback(val); 
    }); 
}; 

나는 또한에 대한 Promise을 읽었습니다, 그러나 당신은 어떻게 등등 공정, 약속 등의 라이브러리를 사용하지 않고 비동기 비 차단 함수를 작성 않습니다

나는 process.nextTick를 사용하여 비동기 기능을 만드는 방법을 알아?

기본 방법은 무엇입니까? 나는이 방법에 첫번째 생각 :

var async = function(val, cb) { 
    cb(val);  
} 

그러나, 기능 블록 :

async(3, function(val) { 
    console.log(val); 
}); 
console.log(4); 
// returns: 
3 
4 

그래서 올바른 구현은 무엇입니까? 라이브러리에 의존하지 않고 어떻게 비동기 함수를 작성할 수 있습니까?

+0

난 당신이 정말 API를하지 않으려는 알고 있지만 나는 최근에 자바 스크립트에 대한 반응 확장에이 비디오를 우연히, 그리고 매혹적인 발견했다. 왜 바퀴를 재발견합니까? http://channel9.msdn.com/Blogs/codefest/DC2010T0100-Keynote-Rx-curing-your-asynchronous-programming-blue –

+0

"비동기"와 "비 차단"은 같은 것이 아니라는 점에 유의하십시오. 이 답변 ('process.nextTick','setTimeout' 등)에있는 지시 사항을 따르면 콜백은 비동기 적으로 실행되지만 일단 실행을 시작하면 여전히 이벤트 루프를 차단합니다. –

답변

0

Node.js에서 process.nextTick을 사용해야합니다. 브라우저에서는 setTimeout(function(){},0)보다 훨씬 효율적인 postMessage 해킹을 사용할 수 있습니다. 여기

postMessage 해킹의 크로스 브라우저 구현 : https://github.com/timoxley/next-tick/blob/master/index.js

1

setTimeout을 사용할 수 있습니다. 지연과 같은 기본 기능입니다.

+0

Node.js 만 타겟팅하는 경우'process.nextTick (func)'은'setTimeout (func, 0)'보다 훨씬 효율적이며 가장 실제적으로 똑같은 일을한다는 점은 주목할 가치가 있습니다. http://nodejs.org/docs/latest/api/process.html#process_process_nexttick_callback –

+0

감사합니다. 맞습니다,하지만 질문은 - 순수 js에서 비동기 함수를 수행하는 방법입니다. – AChudov

+0

확실히! 댓글은 다른 독자를위한 것이지, 당신을위한 것이 아닙니다. :) –

0

기능 작업을 청크로 분해하고 process.nextTick을 사용하면 현재 청크가 완료된 후 다음 청크를 대기열에 넣을 수 있습니다. 그렇게하면 각 작업 청크간에 다른 대기중인 콜백이 실행될 수 있습니다. 모든 청크가 완료되면 함수에 전달 된 콜백을 매개 변수로 호출하십시오.

위의 내용은 함수가 특별한 작업을 수행하지 않고 자연스럽게 비동기로 만드는 기존의 비동기 API를 호출하지 않는다고 가정합니다.