2014-10-21 2 views
1

라이브러리에있는 일부 지연/약속 객체를 깊이 사용하고있는 많은 친구들은 종종 자신의 구현에서 타이머를 사용하는 것이 나쁘다고 말합니다.지연/약속 구현의 타이머를 악용하고 있습니까?

은 A +에 해당하지 않는 : https://github.com/promises-aplus/promises-spec

그리고 jQuery를 같은 많은 라이브러리와 다른 타이머를 사용하지 않습니다. 그래서 나는 약속의 이행과 관련 될 수 jQuery를 소스에있는 타이머를 찾기 위해 시도하지,하지만 성공했습니다

https://github.com/jquery/jquery/blob/master/src/deferred.js

모든 오른쪽,하지만 난에 몇 가지 메모를 발견했습니다 + 설명,이

Notes 기사에서 : 거기에 타이머를 사용하는 방법에 대해 저를 혼동 여기

"플랫폼 코드는"엔진, 환경을 의미하며, 구현 코드를 약속드립니다. 실제로이 요구 사항은 onFulfilled 및 onRejected가 이벤트가 호출 된 다음 비동기 적으로 실행되도록 보장하고 새로운 스택을 사용합니다. setTimeout 또는 setImmediate과 같은 "매크로 태스크"메커니즘을 사용하거나 MutationObserver 또는 process.nextTick과 같은 "마이크로 작업"메커니즘을 사용하여 을 구현할 수 있습니다. 약속 구현 은 플랫폼 코드로 간주되므로 자체적으로 핸들러가 호출되는 작업 스케줄링 큐 또는 "trampoline"을 포함 할 수 있습니다.

그래서 저는 A +가 타이머에 대해 엄격한 규칙을 사용하지 않았거나했는지 이해 했습니까?

도와주세요. 나는 혼란 스러워요.

+0

* 어디서 * 약속 이행에서 악의적이라고 생각하는 타이머를 사용합니까? – Bergi

답변

3

당신은 "타이머 설정"을 setTimeout의 사용에 혼동 - 약속/A + 구현은 일반적으로 핸들러 함수의 비동기 실행을 보장하기 위해 setTimeout을 사용하여, 어떤 시간에 의해 실행을 지연하지.

약속이 수행 된시기에 관계없이 충족 및 거부 된 메서드가 비동기 적으로 호출된다는 약속/A + 보증을 제공합니다. 브라우저 JS 환경에서 비동기 실행을 보장하는 한 가지 방법은 setTimeout에 함수 호출을 시간 제한 (기본값)으로 래핑하는 것입니다.

jQuery는 충족/​​거부 된 콜백 (즉, a major design flaw)의 asyc 실행을 보장하지 않으므로 비동기 래퍼 호출이 필요하지 않습니다.

1

일반적으로 응용 프로그램에서 타이머를 사용하는 것은 나쁜 작업입니다 (즉, 작업 예약 이외).

조치가 얼마나 오래 걸릴지 확신 할 수 없습니다. 따라서 다음 세 가지 중 하나를 수행하게됩니다.

  • 시간이 충분하지 않은 경우, 예상되는 일이 아직 일어나지 않았기 때문에 물건이 끊깁니다.
  • 은 또는 당신은 응용 프로그램, 당신은 때때로 휴식에 응용 프로그램을 일으키는 충분한 시간을 할당 이유없이
  • 또는 최악의 경우에 대한 느린 경우에 너무 많은 시간을 할당하고, 때로는 작업 예상대로

사양 및 내용에 대해 잘 모르겠습니다. 그러나 일반적으로 응용 프로그램에서 타이머와 지연을 사용하는 것은 나쁜 생각입니다.