2017-11-08 6 views
0

나는 다음과 같은 코드에 약간의 도움을 받고 싶습니다 : 나는 DataAssociation 객체에 DataAssociationIDS의 배열을 변환하려고 위의 코드에서각도 4 체인 HTTP GET 요청 (약속)

fillDataAssociationsArray(DataAssociationIDS: string[]) { 
const promise = new Promise((resolve, reject) => { 
    for (const id of DataAssociationIDS) { 
    this.api.getDataAssociationByID(id).toPromise().then(
     data => { 
     this.DataAssociations.push(data.body.entities.DATAASSOCIATIONS[0]); 
     }); 
    } 
    resolve(); 
}); 

return promise;} 

, 그리고보다 DataObjects []의 로컬 배열로 푸시합니다. 배열 (매개 변수)에서 ID를 가진 각 DataObject를 가져오고 백엔드에서 올바른 DataObject를 리턴하는 API에 get 요청을 수행하는 것보다.

public getDataAssociationByID(dataAssociationID: string) { 
return this.http.get<DataAssociationInterface>(this.apiURL + 'typeOne=DATAASSOCIATIONS&id=' + dataAssociationID, 
{ observe: 'response' });} 

나는 각 요청은 이전 요청의 결과에 따라 어디에 체인에 일부 HTTP 내 API를, 의 요청을 얻을합니다. 그래서 내 생각은 이러한 요청에 대한 약속을하고 then() 메서드를 firstRequest(). then (SecondRequest(). then (...))과 같이 사용하는 것입니다.

() 다음에

ngOnInit() { 
    this.fillDataAssociationsArray(this.extractDataAssociationIdsFromActivities()).then(
() => console.log(this.DataAssociations) 
    //() => console.log(this.DataAssociations[0].languages.DUT.name) 
);} 

First result Second line result

이 첫 행하려고 내 - 판화 정확한 결과 로컬 배열 그러나, I 번째 행하려고하면 (주석) 어느 정의되지 않은 항목의 이름을 출력합니까 ??? 그리고 다음 요청을 체인화 할 때 분명히 undefined를 읽을 수 없습니다.

답변

0

여기 비동기 문제가 있다고 생각합니다.

http get 호출에서 결과를 얻기 전에 약속을 해결할 가능성이 있습니다.

이 문제를 해결하는 가장 좋은 방법은 api 호출을 추가하여 ID 배열을 가져 와서 결과 배열을 반환하는 것입니다. 그러나이 사용 사례에 대한 나의 접근 방식은 다음과 같습니다

fillDataAssociationsArray(DataAssociationIDS: string[]) { 
 
const promise = new Promise((resolve, reject) => { 
 
    for (const id of DataAssociationIDS) { 
 
    this.api.getDataAssociationByID(id).toPromise().then(
 
     data => { 
 
     this.DataAssociations.push(data.body.entities.DATAASSOCIATIONS[0]); 
 
     if (this.DataAssociations.length === DataAssociationIDS.length) { 
 
      resolve(); 
 
     } 
 
     }); 
 
    } 
 
}); 
 

 
return promise;}

+0

당신의 선생님이 영웅입니다! if 문은 문제를 해결했으며 모든 호출이 실행되기 전에 실제로 Promise가 해결되었습니다. –

+0

굉장! 도와 줄 수있어서 기뻐 :) –