2012-11-06 4 views
5

지속 시간이 0 인 타이머를 만들면 작업을 이벤트 대기열로 지연시킬 수 있습니다. 나는이 특징을 정말 좋아한다. 왜냐하면 그것은 많은 불쾌한 재진입 문제를 피할 수 있기 때문이다. 이 의도적 인 기능이 변경되지 않습니까? 설명서에 추가 할 수 있습니까? 그렇지 않은 경우이 작업을 수행 할 수있는 지원되는 방법이 있습니까?Dart : 제로 지속 시간 타이머를 사용하여 이벤트 루프에 작업을 연기하는 지원되는 방법

답변

5

현재 대답

scheduleMicrotask(Function callback) 함께 할 수있는 적절한 방법. https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart-async#id_scheduleMicrotask

비동기 작업 및 이벤트 루프에 대한 좋은 기사가 여기에 있습니다 : :

여기 API 설명서를 참조하십시오 https://www.dartlang.org/articles/event-loop/

올드 대답 (사전 다트 1.0) 지금은

는 대답은 예, new Timer(0, callback)은 함수 호출을 연기하는 가장 쉬운 방법입니다.

곧, http://dartbug.com/5691이 수정되어 더 좋은 방법이 될 것입니다. Timer의 문제점은 HTML 스펙이 콜백이 4ms가 지나지 않아 발생해야한다는 것입니다. 당신이하는 일에 따라 문제가 될 수 있습니다.

Microsoft는이 문제를 해결하기 위해 setImmediate()을 도입했습니다. 다시 그리기 후 다음 이벤트 루프의 시작 부분에서 콜백을 호출합니다. 다트에서 내가 선호하는 솔루션은 Future.immediate()이 다음 이벤트 루프까지 연기되도록하는 것이며 콜백을 사용하는 defer()과 같은 함수 일 수 있습니다.

new Timer(0, f)도 더 나은 솔루션을 사용할 수있는 경우에도 여전히 작동합니다. 나는 그것에 대한 보푸라기가 신경 쓰이지 않을 것이다.

+0

헉, 4ms 지연은 불행합니다. "연기"(그리고 Future.immediate 사용하는 데) 좋은 소리. 지금은 타이머로 가짜 함수를 코딩 할 수 있습니다. 나는 이것이 정말로 중요하다고 생각한다. 앞으로가는 전화에서 다시 전화를받는 것은 항상 이벤트 중심 코드에서 까다로운 버그로 이끌었습니다. 멋진 다른 일은 "대기열을 뛰어 넘는"긴급한 이벤트를 만들 수 있다는 것입니다. 대기중인 이벤트가 처리되기 바로 전에 상태를 변경할 수 있도록하기 위해이 작업을 수행하려는 경우가 있습니다. –

+0

비동기 API의 현재 상태를 반영하여 내 대답을 업데이트했습니다. 훨씬 더 좋습니다. 4ms 지연은 현재 지원되는 모든 브라우저 (IE 10 이상)에서 사라져야한다고 생각합니다. –