angular - 订阅承诺
问题描述
在我的 Angular 7 应用程序中,我有下一个功能:
getUserData(uid) {
return this.fireStore.collection('users').doc(uid).valueChanges().subscribe(data => {
this.writeCookie(data)
this.currentUser = data;
})
}
我想在另一个方法中使用这个函数:
someMethod() {
...
new Promise(this.getUserData(uid))
.then(() => {...})
...
}
但我不能这样做,因为 TypeScript 会抛出错误:
'Subscription' 类型的参数不可分配给 '(resolve: (value?: {} | PromiseLike<{}>) => void, reject: (reason?: any) => void) => void' 类型的参数. 类型 'Subscription' 不提供签名匹配 '(resolve: (value?: {} | PromiseLike<{}>) => void, reject: (reason?: any) => void): void'.ts(2345 )
如何将getUserData()
方法转换为承诺,或forJoin
改用?
提前致谢。
解决方案
subscribe
将类型从 更改Observable
为Subscription
,从而导致类型错误。
您可能想要的是将 Observable 转换为 Promise,同时保留函数调用。您可以通过管道传递 Observabletap
然后使用toPromise
. 像这样:
getUserData(uid) {
return this.fireStore.collection('users').doc(uid).valueChanges().pipe(
tap(data => {
this.writeCookie(data)
this.currentUser = data;
}),
first()
).toPromise()
}
确保创建一个完成的管道,就像你可以对first
操作符做的那样,否则 Promise 永远不会解决。
new Promise(...)
您可以在您的消费者中省略。
推荐阅读
- eslint - 此实验语法需要启用解析器插件:'classPrivateMethods'
- r - table1() 和 t1kable() 忽略因子的命名级别
- data-structures - 关于AVL树属性的问题
- python - 如何通过迭代列表来使用 PyPika 构建 SQL 查询?
- google-sheets - 在谷歌表格中,我如何使用一系列单元格来使用“SEARCH(search_for”)功能?
- android - 使用存储访问框架请求访问文件夹时,Intent.FLAG_GRANT_PREFIX_URI_PERMISSION 有什么用?
- python-3.x - pytest 找不到数据库和表
- laravel - laravel atymic/twitter 不在 linux 服务器上运行,而是在 macbook (homebrew) 上运行
- cplex - CPLEX 中的时间测量单元
- sql - 选择子句结果作为比较表达式