2016-06-23 3 views
8

필자는 이오니아 2 응용 프로그램에서 저장소의 데이터를 가져온 다음 해당 데이터를 사용하여 HTTP 요청을 생성해야하는 상황이 있습니다. 문제는 SqlStorage 메서드가 약속을 반환하고 http meth가 observables를 반환한다는 것입니다. 나는 그것이 작동하도록하기 위해이 같은 일을하는 데 :이오닉 2/각도 2 약속 준수 다시보기

getToken() { 
    return this.storage.get('token').then((token) => { 
     this.token = token; 
     return token; 
    }); 
} 

loadStuff(){ 
    return this.tokenService.getToken().then(token => { 
     return this.http.get("https://www.urltodatasource.com/api/v1/Endpoint?access_token="+token).map(res => res.json()); 
    }); 
    } 

을하고 그것을 얻이 같은 일을 :

this.tokenService.loadStuff().then(observable => { 
    observable.subscribe(data => { 
     this.storage.set('stuff', data); 
     return data; 
    }); 
}) 

내가 각도와 이온에 아주 새로운 해요 일반적으로, 내가하려는 일을 성취 할 수있는 더 좋은 방법이있는 것처럼 느껴지지만 어떻게해야할지 모르겠습니다. 또한, 거기 관찰 가능한에 대한 가능한 모든 리소스 나처럼 매우 혼란 감수성이 예민한 젊은 개발자 잎 빠르게 매우 복잡 매우를 얻을.

누구든지이 작업을 더 잘 수행 할 수있는 방법에 대해 설명해 줄 수 있습니까? 감사!

+0

'loadStuff'에서'this.http'는 Angular2'Http' 서비스입니까? – yarons

+0

Yup @yarons입니다. 정상적인 HTTP 서비스가 파일의 상단에서 가져오고 내 "StuffService"의 생성자에 종속성으로 추가됩니다. – TheBrockEllis

답변

2

각도 2에서 Http 서비스 기능 (get, post 등)은 Observable object을 반환합니다. 이것은 그들이 구현 한 방식입니다.

약속을 지키고 대신 약속을 반환하기를 원하는 경우 Observable 개체에 내장 된 toPromise 함수를 사용할 수 있습니다.

loadStuff(){ 
    return this.tokenService.getToken().then(token => { 
     return this.http.get("https://www.urltodatasource.com/api/v1/Endpoint?access_token="+token).toPromise()); 
    }); 
} 

그리고는

여기
this.tokenService.loadStuff().then(data => { 
    data = data.json(); //you might need to do that, depending on the structure of the response 
    this.storage.set('stuff', data); 
    return data; 
});  
9

당신이 할 수있는 작업은 다음과 같습니다

귀하의 코드

getToken: Observable<any> = 
    Observable.fromPromise(this.storage.get('token').then(token => { 
    //maybe some processing logic like JSON.parse(token) 
    return token; 
})); 
변경
getToken() { 
    return this.storage.get('token').then((token) => { 
     this.token = token; 
     return token; 
    }); 
} 

이하

그러면 구성 요소에서 관찰 할 수있는 것과 같이 소비 할 수 있습니다. 또한 이러한 수입 추가해야합니다

getToken() { 
    return Observable.fromPromise(this.storage.get('token') 
    .then((token) => { 
     return token; 
    })); 
} 

loadStuff(){ 
    return this.tokenService.getToken() 
    .flatMap(token => { 
     return this.http.get("https://www.urltodatasource.com/api/v1/Endpoint?access_token="+token) 
     .map(res => { 
      return res.json(); 
     }); 
    }); 
} 

this.tokenService.loadStuff().subscribe(data => { 
    this.storage.set('stuff', data); 
    return data; 
}); 

:

this.serviceClass.getToken.subscribe(token => { 
//whatever you want to with the token 
}); 
+1

foget하지 마라 : "Observable} from"rxjs "; – Harold

+0

매력처럼 작동합니다, 감사합니다! –

1

나는 Observable.fromPromise().flatMap()의 조합을 사용하여 작동하도록있어

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/observable/fromPromise'; 
import 'rxjs/add/operator/mergeMap'; 
0

사용 을 'Observable.fromPromise ' 약속을 관찰 가능으로 변환하십시오.

관련 문제