미리 감사드립니다.ES6 약속 - 지연을 사용하지 않고 React componentDidMount 함수 중에 인스턴스화 된 객체에 대한 최종 액세스를 어떻게 보장 할 수 있습니까?
나는 (과거에 내가 Q 또는 각도의 $ Q 서비스 사용했습니다) 처음 ES6 기본 약속을 사용하고 있습니다. 나는 연기 된 것을 사용함으로써 쉽게 해결할 수있는 문제가 있으며, ES6 약속이 그것을 사용하지 않는다는 것을 발견하면 놀랐습니다.
나는 안티 패턴으로 연기의 사용을 참조 블로그에 많은 사람들을 발견하고 더욱 놀랐다. 그들의 사용을 비판하는 몇 개의 블로그를 읽은 후에도, 나는 아직도 왜 그 이유를 이해하지 못한다 - 그들의 예는 내가 처음으로 연기하기를 결코 사용하지 않았던 장소 였고 어쩌면 나는 뭔가를 놓쳤다. (그리고 설명을 신경 쓰지 않을 것이다. 왜 그들이 나쁜쪽으로 나쁜지). 그러나 베스트 프랙티스의 한계에 머무르기 위해, 나는 그들을 지원하는 라이브러리를 사용하지 않고 무언가를 해결하는 방법을 알아 내려고 노력하고 있습니다.내 반작용/돌아 오는 응용 프로그램에서지도를 만들 수 OpenLayers 라이브러리를 사용하고 있습니다. OpenLayers는 맵 객체가 생성 될 때 DOM 요소를 사용하여 맵을 배치해야합니다. 따라서 구성 요소가 탑재 될 때까지 OpenLayers 맵을 인스턴스화 할 수 없습니다. 괜찮습니다. componentDidMount를 통해 라이프 사이클 후크가 있습니다. 내가 문제로 실행
내가 다른 클래스에 해당 맵 오브젝트를 노출 할 필요가 그 클래스는 맵이 생성 될 때까지 실행 기다릴 필요가 코드를 가지고있다. A는 연기와 함께 아래와 같이
, 나는 매우 간단하게이 문제를 해결할 수 :
const deferred = Q.defer();
const Foo = React.createClass({
componentDidMount() {
const map = new ol.Map(...);
deferred.resolve(map);
}
...
}
export getMap => deferred.promise
는 그러나 ES6의 약속, 내가 붙어있어. 즉시 해고 때문에
은 내가 componentDidMount 클래스의 외부 약속을 인스턴스화 할 수 없습니다.
componentDidMount 함수의 범위 내에서 약속을 인스턴스화하거나 내 코드가 동기이므로 Promise.resolve를 사용하면 약속이 getMap 함수의 범위를 벗어납니다.
약속 개체를 componentDidMount의 범위를 벗어나 선언하지만 인스턴스화하지 않으면 getMap은 componentDidMount가 실행될 때까지 undefined를 반환하여 처음에는 약속이있는 지점을 무효화합니다.
OpenLayers지도가 매우 가변적이며 자체 작업을 수행하기 때문에 Redux 상태로지도를 넣지는 않을 것입니다. 거기에지도를 넣으면 불변성에 대한 Redux 약속이 깨질 것입니다. 나는 Redux 솔루션을 포기했다. "mapAvailable"과 같은 Redux 상태에서 부울을 던지면 해킹 된 것처럼 느껴집니다. 아마 그 일을 할 수는 있지만 여러 가지 이차적 인 문제를 야기 할 수 있습니다.
그래서 나는 무엇을 놓치고 있습니까? 지연이 실제로 올바른 대답 인 코너 케이스에 있습니까? 아니면 확실하지 않은 것입니까?
는 다시, 시간 내 주셔서 감사합니다.
이 두 가지 질문을 모두 해결할 수 있다고 생각합니다. 제대로 "해결"하는 것에 대해 생각하지 않았습니다. 나는 당신이 그것에 관해 더 많이 생각할 때 당신의 반응을 라이브로 편집하는 것을 지켜보고 있으며, 나는 당신이 내 질문에 대한 추가적인 생각을 굽히는 것에 감사한다. 이것이 끔찍한 패턴인지 여부는 응용 프로그램에 Foo 구성 요소가 하나뿐이므로 단일 요소가 상대적으로 적합합니다. 필요한 모든 측면에서, 애플리케이션 전반에 걸쳐 많은 다른 클래스는 OpenLayers 맵 객체의 유일한 복사본에 액세스해야합니다. 여전히 나쁜 결정 인 것 같습니까? – JSager
네, 그렇습니다. 'Foo'싱글 톤의 독창적 인 싱글 톤으로 약속을하는 것은 여전히 나쁜 생각입니다. 앱에서 인스턴스화 할 때마다지도의 약속을 인스턴스화해야합니다. 그래서 그냥'Foo'의 평범한 재산으로 만드십시오. – Bergi
제가 예상하는 몇 가지 문제점이 있습니다. 첫째, React가 내 구성 요소를 인스턴스화 할 때 제어 할 수있는 권한이 없습니다. 둘째로 React 컴포넌트를 내보내는 것이 아닙니다. React-Redux 구성 요소는 내 문제와 관련이 없어 보였으므로 포함하지 않은 코드의 다른 부분에 내보내고 전체 React 클래스를 약속으로 래핑하면 새로운 범위 지정 문제가 발생합니다. 마지막으로, 처음에 설명했듯이, React 구성 요소의 생성자에 약속을 넣을 수 없습니다. 왜냐하면 안전하게지도를 인스턴스화하기 전에 수명주기의 "마운트 된"부분에 충돌해야하기 때문입니다. – JSager