当我将 promise 与 subscribe 和另一个异步任务混合在一起时,这对我来说变得很复杂。
这是我的身份验证服务:
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 对用户 session 进行身份验证。尽管如此,
getCurrentUserToken()
sendEmail()
正在异步运行,所以我必须使用 Promise
通过Token
至sendEmail()
函数,并让 sendEmail 函数调用 API 发送电子邮件。没有 promise ,我可以订阅
http.post
像这样:this.httpService.sendEmail(element).subscribe(
data3 => {
console.log(data3)
}, error => {
console.log(error)
}
))
不幸的是,当我将 promise 添加到其中时,我搞砸了,console.log 正在返回:
Observable {_isScalar: false, source: Observable, operator: MapOperator}
请告知如何订阅
http.post
位于 Promise
内.
最佳答案
这里真的没有必要让事情复杂化。
我将使用 async
/await
语法在这里和为此,我们将不得不使用 Promise
s 而不是 Observable
s。好消息是,我们可以利用 toPromise()
Observable
上的方法值将其更改为 Promise
也关注我在代码中的注释
这是实现
对于 getCurrentUserToken
getCurrentUserToken() {
return firebase.auth().currentUser.getIdToken(true);
// This will already return a Promise<string>
// So no need to do a .then and then return from there.
}
对于
sendEmail
async sendEmail(email) {
// Since getCurrentUserToken returns a Promise<string> we can await it
const token = await this.authService.getCurrentUserToken();
// token will now have the Current User 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).toPromise();
// Notice how we're calling the .toPromise() method here
// to change Observable into a Promise
}
如何使用它?
此代码将进入您之前调用
this.httpService.sendEmail
的组件方法中. 请务必将该功能标记为 async
尽管。 // We can only await something in a function which is declared of type async
async sendEmail() {
try {
const data = await this.httpService.sendEmail(element);
// Since sendEmail again returns a Promise, I can await it.
console.log(data);
} catch (error) {
console.log(error);
}
}
关于javascript - 订阅放置在 Promise Angular 6 中的 http.post,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52794858/