内容简介:翻译自:https://stackoverflow.com/questions/41885219/angular-2-firebase-observable-to-promise-doesnt-return-anything
我目前正在使用AngularFire2开发一个Angular 2项目,我正在尝试将FirebaseListObservable转换为Promise.我知道它没有多大意义,因为Observables更有用,但是这个函数将成为链接多个promise的另一个函数的一部分.而且我不熟悉如何在一系列承诺中订阅Observable …该函数在服务中执行,但它似乎没有返回任何东西.
基本上,我想要做的是检查Firebase列表中是否已存在具有特定名称的对象并返回true或false.
服务
constructor(private _af: AngularFire) { } nameExists(name: string): Promise<boolean> { return this._af.database.list('users') .map(users => { let exists = false; users.forEach(user => { if(user.name.toLowerCase() === name.toLowerCase()) { console.log('Name already exists!'); exists = true; } }); return exists; }).toPromise(); }
零件
constructor(private _usersService: UsersService) { } check(name) { this._usersService.nameExists(name) .then(bool => console.log(bool)); }
因此,当匹配时,函数会被执行并且在打印到控制台时似乎正常工作.但是,组件中的console.log()不会被执行.我想从未达到“那么”部分.另外,有没有办法在找到匹配后停止forEach循环?
任何帮助将不胜感激,因为我找不到任何答案.
问题是toPromise运算符将observable转换为解析为observable的最终值的promise.这意味着必须在诺言结算之前完成观察.
在AngularFire2中,list和object observables没有完成;只要数据库发生变化,它们就会重新发射
您可以使用第一个运算符解决问题,该运算符获取第一个发射值,然后完成组合的observable:
import 'rxjs/add/operator/first'; import 'rxjs/add/operator/map'; import 'rxjs/add/operator/toPromise'; ... return this._af.database .list('users') .map(users => { let exists = false; users.forEach(user => { if (user.name.toLowerCase() === name.toLowerCase()) { console.log('Name already exists!'); exists = true; } }); return exists; }) .first() .toPromise();
翻译自:https://stackoverflow.com/questions/41885219/angular-2-firebase-observable-to-promise-doesnt-return-anything
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 使用jQuery加载承诺
- Hortonworks收入增长40% 正努力兑现盈利承诺
- 腾讯支持GPL合作承诺 促进开源文化发展
- mongodb – Mongoose JS承诺?或者如何管理批量保存
- Angular 6.0 即将发布,承诺更小更快更易用
- 万豪国际承诺:如果发生欺诈行为将支付新护照的费用
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。