2017-09-27 3 views
0

복귀와 아약스 약속/다른 블록 :경우, 나는이처럼 보이는 <code>if/else</code> 블록이

Prefably
if (this.getSessionStorageData()) { 
    this.initialData(this.getSessionStorageData()); 
} else if (this.shouldPerformXHR) { 
    this.loadXHRData(); 
} 

내가 선택적으로,이 블록을 확장 아마도 switch 문에 조금을 만드시겠습니까

let data = []; 

if (this.getSessionStorageData()) { 
    data = this.getSessionStorageData(); 
} else if (this.shouldPerformXHR) { 
    data = this.loadXHRData(); 
} 

return data; 

그러나 loadXHRData은 AJAX 요청입니다. 이 예제에서 shouldPerformXHR이 true이면 AJAX 요청이 완료되기 전에 데이터가 리턴 될 것이라고 추측합니다.

이제는 XHR 요청이 실제로 약속이므로 전화를 받고 then을 사용할 수는 있지만 내 sessionStorage 데이터는 약속을 사용하지 않습니다.

내 두 번째 예제와 같은 데이터 구조를 가질 수는 있지만 내 약속이 있거나 불가능한 방법이 있습니까?

어떤 전략 (ajax, 세션 등)이든간에 데이터를 반환하는 방법이 필요합니다. 하지만 현재 아약스 요청의 .then 절에서 내 데이터를 설정해야하는 것처럼 보입니다.이 절은 저에게 논리가있는 곳으로 안내합니다.

바라기를 바랍니다.

+0

잘 당신은 호출에서 반환 할 수 없습니다 getSessionStorageData가 약속을 되찾아 즉시 해결하도록 설정하십시오. – epascarello

+0

"Promise.resolve"를 찾고 계십니다. 예, 항상 비동기로 함수를 처리해야합니다. – Bergi

답변

1

비동기 호출을 동기식으로 해결하면 작동하지 않습니다. 따라서 your data = this.loadXHRData();은이 방법으로 작동하지 않습니다.

이는 AJAX 호출이 여기에 라인에서 해결 될 수 없기 때문에 함수가 호출 수신자에 의해 해결하기 위해 뭔가를 반환해야 함을 의미

그래서 우리는 값 this.getSessionStorageData(); 돌아 해결하는 대신 약속을 반환 할 수 :

if (this.getSessionStorageData()) { 
    return Promise.resolve(this.initialData(this.getSessionStorageData())); // Will return a new Promise which is then-able. 
} else if (this.shouldPerformXHR) { 
    return this.loadXHRData(); 
} 

그리고 당신의 수신자가 수행하여이 약속을 해결해야한다 : 당신이 D에 도착 있도록

myFunction().then(function(data) { 
// do stuff with the data 
}); 
+0

좋습니다.'.resolve '를 호출하면 즉시 해결됩니까? 이것은 Promises에서 다른 모든 것을 감싸는 느낌을 주지만 꽤 깔끔할 수 있습니다. –

+0

그게 유일한 옵션입니다. AJAX를 동 기적으로 해결할 수 없으므로 코드가 비동기 성질에 적응해야합니다. –