Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firestore查询未获取最新数据_Javascript_Angular_Firebase_Google Cloud Firestore_Rxjs - Fatal编程技术网

Javascript Firestore查询未获取最新数据

Javascript Firestore查询未获取最新数据,javascript,angular,firebase,google-cloud-firestore,rxjs,Javascript,Angular,Firebase,Google Cloud Firestore,Rxjs,我在Angular中制作了一个route guard,它在允许访问所述路线之前检查firestore中的某个值 HTTP云功能完成后,组件将被路由到。此云函数在firestore文档中创建一个名为协议的对象,然后路由监听该对象内的状态,以决定是否允许访问。但是,我们遇到的问题是,可能有9/10次,守卫似乎认为协议对象在文档中不存在,因此抛出错误。(尽管我可以在firestore中看到协议对象!) 我已经记录了流,它正确地记录在订阅中,然后记录在guard中,因此我知道HTTP函数在尝试路由和调用

我在Angular中制作了一个route guard,它在允许访问所述路线之前检查firestore中的某个值

HTTP云功能完成后,组件将被路由到。此云函数在firestore文档中创建一个名为
协议
的对象,然后路由监听该对象内的状态,以决定是否允许访问。但是,我们遇到的问题是,可能有9/10次,守卫似乎认为
协议
对象在文档中不存在,因此抛出错误。(尽管我可以在firestore中看到协议对象!)

我已经记录了流,它正确地记录在订阅中,然后记录在guard中,因此我知道HTTP函数在尝试路由和调用guard类之前已经完成

这是警卫:

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    this.tenancyOffer$ = this._tenancyOffer.getTenancyOfferById(route.params.offerId).get({source: 'server'})).valueChanges();
    
    return this.tenancyOffer$.pipe(
      map((tenancyOffer) => {
        if (tenancyOffer.status === 'incomplete'
          && tenancyOffer.agreement.status === 'incomplete') {
          return true;
        } else {
          this._router.navigate(['/' + Landlord.base, Landlord.manage.base, Landlord.manage.applications.base, route.params.propId, Landlord.manage.applications.summary, route.params.offerId]);
        }
      })
    );
  }
GetTenancyOfferById:

this.tenancyOfferCollection = afs.collection<any>('tenancy_offers');

getTenancyOfferById(id: string) {
  return this.tenancyOfferCollection.doc(id);
}
我对整个firestore文档做出了云函数的响应,其中包含协议对象,该对象记录在
console.log({e})中。然后,我在guard中记录(之后)文档的值,但它不存在,即使我在这里再次调用firestore


有人知道为什么guard中的
gettenacyOfferById(route.params.offerId)
函数没有从firestore返回此文档的最新版本,即使云函数需要在订阅路由之前结束吗?

我猜
this.tenacyOfferCollection=afs.collection('tenancy_offers');
是在您的服务中的某个位置定义的。如果这是真的,则在加载应用程序后将立即加载集合

我建议在您的服务中存储
u提供的
值,并从您的警卫处读取

服务:

export class YourService {

  private tenancyOfferMap: Map<string, any> = new Map();

  constructor(
    private afs: AngularFirestore,
  ) {
    afs.collection<any>('tenancy_offers').snapshotChanges()
      .subscribe( actions => {
        actions.map( action => {
          this.tenancyOfferMap.set(action.payload.doc.id, action.payload.doc.data());
        });
      });
  }

  getTenancyOfferById(id: string) {
    return this.tenancyOfferMap.get(id);
  }

}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
    const tenancyOffer = this.yourService.getTenancyOfferById(route.params.offerId);
    if (tenancyOffer.status === 'incomplete'
      && tenancyOffer.agreement.status === 'incomplete') {
      return true;
    } else {
      return this._router.navigate(['/' + Landlord.base, Landlord.manage.base, Landlord.manage.applications.base, route.params.propId, Landlord.manage.applications.summary, route.params.offerId]);
    }
  }
导出类服务{
private-tenacyOfferMap:Map=new-Map();
建造师(
私人afs:AngularFirestore,
) {
afs.collection('tenancy_offers')。快照更改()
.订阅(操作=>{
actions.map(action=>{
this.tenacyOfferMap.set(action.payload.doc.id,action.payload.doc.data());
});
});
}
getTenancyOfferById(id:string){
返回此.tenacyOfferMap.get(id);
}
}
守卫:

export class YourService {

  private tenancyOfferMap: Map<string, any> = new Map();

  constructor(
    private afs: AngularFirestore,
  ) {
    afs.collection<any>('tenancy_offers').snapshotChanges()
      .subscribe( actions => {
        actions.map( action => {
          this.tenancyOfferMap.set(action.payload.doc.id, action.payload.doc.data());
        });
      });
  }

  getTenancyOfferById(id: string) {
    return this.tenancyOfferMap.get(id);
  }

}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
    const tenancyOffer = this.yourService.getTenancyOfferById(route.params.offerId);
    if (tenancyOffer.status === 'incomplete'
      && tenancyOffer.agreement.status === 'incomplete') {
      return true;
    } else {
      return this._router.navigate(['/' + Landlord.base, Landlord.manage.base, Landlord.manage.applications.base, route.params.propId, Landlord.manage.applications.summary, route.params.offerId]);
    }
  }
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察的|承诺|布尔| UrlTree{
const tenacyOffer=this.yourService.gettenacyOfferById(route.params.offerId);
如果(tenancyOffer.status==‘未完成’
&&tenancyOffer.agreement.status==“未完成”){
返回true;
}否则{
返回此文件。_router.navigate(['/'+lown.base,lown.manage.base,lown.manage.applications.base,route.params.propId,lown.manage.applications.summary,route.params.offerId]);
}
}

这可能取决于您的流未完成这一事实

canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot){
this.tenacyOffer$=this.\u tenacyOffer.gettenacyOfferById(route.params.offerId).get({source:'server'})).valueChanges()
.管道(取(1));//{
如果(tenancyOffer&&tenancyOffer.status===‘未完成’
&&tenancyOffer.agreement.status==“未完成”){
返回true;
}否则{
此.u router.navigate(['/'+lown.base,lown.manage.base,lown.manage.applications.base,route.params.propId,lown.manage.applications.summary,route.params.offerId]);

return false;//你能给我看一下你的
this.\u tenacyOffer.gettenacyOfferById(route.params.offerId)的代码吗.get
?@N.F.我已将其添加到我的问题中!恐怕仍然存在相同的问题!您是否100%确定
route.params.offerId
填充了正确的值?共享您的数据模型/结构示例可能也会有所帮助。