Мне становится сложно, когда я смешиваю обещание с подпиской и другой асинхронной задачей.
Это мой сервис аутентификации:
getCurrentUserToken(){
return new Promise((resolve,reject)=>{
firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) {
resolve(idToken)
}).catch(function(error) {
reject(error)
});
})
}
Это мой сервис http:
sendEmail(email) {
return this.authService.getCurrentUserToken().then(token => {
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': 'Basic server-Password',
})
};
let data = email
data['idToken'] = token
return this.http.post(this.apiServer + 'sendEmail', data, httpOptions)
})
}
Вот как я вызываю функцию sendEmail(email)
в компоненте:
Observable.fromPromise(this.httpService.sendEmail(element)).subscribe(
data3 => {
console.log(data3)
}, error => {
console.log(error)
}
))
Я должен передать currentUserToken в API, чтобы позволить API аутентифицировать сеанс пользователя, но обаgetCurrentUserToken()
sendEmail()
работают в асинхронном режиме, поэтому я должен использовать Promise
для передачи функции Token
в sendEmail()
и позволить функции sendEmail вызывать API для отправки электронной почты.
Без обещания я могу подписаться на http.post
следующим образом:
this.httpService.sendEmail(element).subscribe(
data3 => {
console.log(data3)
}, error => {
console.log(error)
}
))
К сожалению, я облажался, когда добавил обещание, и console.log возвращает это:Observable {_isScalar: false, source: Observable, operator: MapOperator}
Посоветуйте, пожалуйста, как подписаться на http.post
это место внутри Promise
.