Skip to content
This repository has been archived by the owner on Mar 23, 2023. It is now read-only.

Latest commit

 

History

History
112 lines (83 loc) · 3.68 KB

Dispatcher.ko-KR.md

File metadata and controls

112 lines (83 loc) · 3.68 KB
id title
dispatcher-ko-KR
Dispatcher

Dispatcher는 등록된 callback에 데이터를 중계할 때 사용된다. 일반적인 pub-sub 시스템과는 다음 두 항목이 다르다:

  • 콜백은 이벤트를 개별적으로 구독하지 않는다. 모든 데이터 변동은 등록된 모든 콜백에 전달된다.
  • 콜백이 실행될 때 콜백의 전체나 일부를 중단할 수 있다.

소스 코드를 보려면 Dispatcher.js에서 확인할 수 있다.

API

  • register(function callback): string 모든 데이터 변동이 있을 때 실행될 콜백을 등록한다. waitFor()에서 사용 가능한 토큰을 반환한다.

  • unregister(string id): void 토큰으로 콜백을 제거한다.

  • waitFor(array<string> ids): void 현재 실행한 콜백이 진행되기 전에 특정 콜백을 지연하게 한다. 데이터 변동에 응답하는 콜백에만 사용해야 한다.

  • dispatch(object payload): void 등록된 모든 콜백에 데이터를 전달한다.

  • isDispatching(): boolean 이 Dispatcher가 지금 데이터를 전달하고 있는지 확인한다.

예시

가상의 비행 목적지 양식에서 국가를 선택했을 때 기본 도시를 선택하는 예를 보자:

var flightDispatcher = new Dispatcher();

// 어떤 국가를 선택했는지 계속 추적한다
var CountryStore = {country: null};

// 어느 도시를 선택했는지 계속 추적한다
var CityStore = {city: null};

// 선택된 도시의 기본 항공료를 계속 추적한다
var FlightPriceStore = {price: null};

사용자가 선택한 도시를 변경하면 데이터를 전달한다:

flightDispatcher.dispatch({
  actionType: 'city-update',
  selectedCity: 'paris',
});

이 데이터 변동은 CityStore가 소화한다:

flightDispatcher.register(function (payload) {
  if (payload.actionType === 'city-update') {
    CityStore.city = payload.selectedCity;
  }
});

사용자가 국가를 선택하면 데이터를 전달한다:

flightDispatcher.dispatch({
  actionType: 'country-update',
  selectedCountry: 'australia',
});

이 데이터는 두 store에 의해 소화된다:

CountryStore.dispatchToken = flightDispatcher.register(function (payload) {
  if (payload.actionType === 'country-update') {
    CountryStore.country = payload.selectedCountry;
  }
});

CountryStore가 등록한 콜백을 업데이트 할 때 반환되는 토큰을 참조값으로 저장했다. 이 토큰은 waitFor() 에서 사용할 수 있고 CityStore가 갱신하는 것보다 먼저 CountryStore를 갱신하도록 보장할 수 있다.

CityStore.dispatchToken = flightDispatcher.register(function (payload) {
  if (payload.actionType === 'country-update') {
    // `CountryStore.country`는 업데이트 되지 않는다
    flightDispatcher.waitFor([CountryStore.dispatchToken]);
    // `CountryStore.country`는 업데이트가 될 수 있음이 보장되었다

    // 새로운 국가의 기본 도시를 선택한다
    CityStore.city = getDefaultCityForCountry(CountryStore.country);
  }
});

waitFor()는 다음과 같이 묶을 수 있다:

FlightPriceStore.dispatchToken = flightDispatcher.register(function (payload) {
  switch (payload.actionType) {
    case 'country-update':
    case 'city-update':
      flightDispatcher.waitFor([CityStore.dispatchToken]);
      FlightPriceStore.price = getFlightPriceStore(
        CountryStore.country,
        CityStore.city,
      );
      break;
  }
});

country-update는 콜백이 등록된 순서 즉 CountryStore, CityStore, FlightPriceStore 순서로 실행되도록 보장된다.