2016-10-21 3 views
0

그래서 공장 내부 기능에 의해 가져 오는 데이터에 의존하는 2 개의 컨트롤러가 있습니다. 공장은 다음과 같습니다 내 컨트롤러에 다음2 컨트롤러는 공장 내부의 HTTP 요청에 의존합니다.

factory.getData = function() { 
    const req = {...}; 
    return $http(req).then((res) => { 
     this.data1 = res.data.response[0]; 
     this.data2 = res.data.response[1]; 
     return res; 
}) 

:

this.factory.getData().then((data) => { 
    this.controllerData1 = this.factory.data1; 
    this.controllerData2 = this.factory.data2; 
}) 

참고 : 나는 실제 공장 이름을 생략. 이것은 내가 필요한 데이터를 얻습니다. 그러나 두 컨트롤러 모두 분명히 이상적인 http 요청을 시작하지 않습니다. 그래서 data1과 data2가 정의 될 때까지 기다리는 두 번째 컨트롤러가 필요합니다. 어떻게해야합니까?

답변

0
factory.dataPromise = null; 

factory.getData = function() { 
    if (this.dataPromise !== null) { 
     return this.dataPromise; 
    } 
    else { 
     const req = {...}; 
     return this.dataPromise = $http(req).then((res) => { 
      this.data1 = res.data.response[0]; 
      this.data2 = res.data.response[1]; 
      return res; 
     }) 
    } 
} 

솔직히 내가 코드를 약간 리팩토링 할 것을 제안했지만, 약간 조잡하지만 여기에서 일할 수 있어야합니다. 그러나 나는 가능한 한 리팩토링을 거의하지 않고이 대답을하고 싶었다.

열쇠는 항상 약속을 반환하는 것입니다.. 네가 그렇게하는 한, 너 괜찮아. this.data1this.data2이 이미 사용 가능한지 확인하면 다른 HTTP 호출을 할 필요없이 즉시 해결 된 약속을 반환 할 수 있습니다.

아, 명확하지 않은 경우 $q을 포함하거나 약속을 작성할 수 있도록 다른 Promise 라이브러리로 바꾸어야합니다.심각한 문제별로,하지만 당신이 호출 할 때 factory.getData() 실제로 약속에 의해 해결되는 값을 사용하지 마십시오

대해 생각합니다. 그 이유는 내 대답은, 난 그냥 변수 whateverdata 거기에, 왜냐하면 그것은 정말로 당신이 코드를 기반으로 돌아갈 상관 없어, 사용하지 않기 때문에.

어쩌면 이 더 나은 결과를 내고 있습니다.. 그것은 좀 더 직관적

factory.dataPromise = null; 

factory.getData = function() { 
    if (this.dataPromise !== null) { 
     return this.dataPromise; 
    } 
    else { 
     const req = {...}; 
     return this.dataPromise = $http(req).then((res) => { 
      this.data1 = res.data.response[0]; 
      this.data2 = res.data.response[1]; 
      return { data1: this.data1, data2: this.data2 }; 
     }) 
    } 
} 

this.factory.getData().then((data) => { 
    this.controllerData1 = data.data1; 
    this.controllerData2 = data.data2; 
}) 

하고, 실제로 약속의 장점을 활용 : 그 경우에이 리팩토링을 건의 할 것입니다. 그러나 결국 그것은 당신에게 달려 있습니다.

+0

응답 해 주셔서 감사합니다. 나는 리팩토링을 고려할 것이다. 나는 여전히 타이밍 문제가 있다고 생각한다. 2 개의 컨트롤러가 거의 동시에이 데이터를 필요로하는 경우 HTTP 요청이 이미 이루어졌지만 data1 및 data2가 아직 정의되지 않았고 실행이 _else_ 블록으로 진행될 수 있습니다. 내 코드가 여전히 2 개의 HTTP 요청을하는 것을 볼 수 있습니다. – lemontree

+0

바로 그거야, 나는 원래의 아이디어 인 hehe와 함께 가야했다. '$ q'-less이기 때문에 실제로 더 좋습니다. 개념은 HTTP 메소드를 한 번만 실행하고 약속을 변수에 저장하고 나중에 모든 호출에서 사용합니다. 'this.dataPromise = null'을 실행하는'clearData' 함수를 만드는 것이 좋을 수도 있습니다. HTTP 호출에서 새로운 데이터를 다시 얻고 자 할 때 사용합니다. – aaronofleonard

+0

감사합니다. 그 트릭을했습니다. data1과 data2의 데이터가 오래되지 않도록 uI-router의 상태 변경시 dataPromise를 다시 null로 재설정해야합니다. – lemontree