Quantcast
Channel: Active questions tagged react-native+typescript - Stack Overflow
Viewing all articles
Browse latest Browse all 6208

Typescript Class Variable Not Updating / Retaining Value

$
0
0

I am trying to create a class that will fetch / cache users from my Firestore database. For some reason, I can't seem to save or expose the previous promise that was created. Here is my class:

export class UserCache {
  private cacheTimeMilliseconds: number = 600000;
  private userCache: any = {};

  public getCacheUser(userid: string): Promise<User> {
    return new Promise((resolve, reject) => {
      let d = new Date();
      d.setTime(d.getTime() - this.cacheTimeMilliseconds);
      if (this.userCache[userid] && this.userCache[userid].complete && this.userCache[userid].lastAccess > d.getTime()) {
        console.log("User cached");
        resolve(this.userCache[userid].user);
      }

      console.log("Need to cache user");
      this.userCache[userid] = {
        complete: false
      };
      this.getSetUserFetchPromise(userid).then((data) => {
        let user: User = <User>{ id: data.id, ...data.data() };
        this.userCache[userid].user = user;
        this.userCache[userid].complete = true;
        this.userCache[userid].lastAccess = Date.now();
        resolve(user);
      });
    });
  }

  private getSetUserFetchPromise(userid: string): Promise<any> {
    console.log(this.userCache[userid]);
    if (this.userCache[userid] && this.userCache[userid].promise) {
      return this.userCache[userid].promise;
    } else {
      console.log("Creating new user fetch request.");
      this.userCache[userid].promise = firestore().collection('users').doc(userid).get();
      console.log(this.userCache[userid]);
      return this.userCache[userid].promise;
    }
  }
}

Logs: (there are only 2 unique users, so should only be creating 2 new requests)

enter image description here

In the logs I can see that the promise is getting set in getSetUserFetchPromise, but the next time the function is called, the property is no longer set. I suspect it is either a scope or concurrency issue, but I can't seem to get around it.

I am calling getCacheUser in a consuming class with let oCache = new UserCache() and oCache.getCacheUser('USERID')

Edit following Tuan's answer below

UserCacheProvider.ts

import firestore from '@react-native-firebase/firestore';
import { User } from '../static/models';

class UserCache {
  private cacheTimeMilliseconds: number = 600000;
  private userCache: any = {};

  public getCacheUser(userid: string): Promise<User> {
    return new Promise((resolve, reject) => {
      let d = new Date();
      d.setTime(d.getTime() - this.cacheTimeMilliseconds);
      if (this.userCache[userid] && this.userCache[userid].complete && this.userCache[userid].lastAccess > d.getTime()) {
        console.log("User cached");
        resolve(this.userCache[userid].user);
      }

      console.log("Need to cache user");
      this.userCache[userid] = {
        complete: false
      };
      this.getSetUserFetchPromise(userid).then((data) => {
        let user: User = <User>{ id: data.id, ...data.data() };
        this.userCache[userid].user = user;
        this.userCache[userid].complete = true;
        this.userCache[userid].lastAccess = Date.now();
        resolve(user);
      });
    });
  }

  private getSetUserFetchPromise(userid: string): Promise<any> {
    console.log(this.userCache[userid]);
    if (this.userCache[userid] && this.userCache[userid].promise) {
      return this.userCache[userid].promise;
    } else {
      console.log("Creating new user fetch request.");
      this.userCache[userid].promise = firestore().collection('users').doc(userid).get();
      console.log(this.userCache[userid]);
      return this.userCache[userid].promise;
    }
  }
}

const userCache = new UserCache();
export default userCache;

ChatProvider.ts (usage)

let promises = [];

          docs.forEach(doc => {
            let message: Message = <Message>{ id: doc.id, ...doc.data() };

            promises.push(UserCacheProvider.getCacheUser(message.senderid).then((oUser) => {
              let conv: GCMessage = {
                _id: message.id,
                text: message.messagecontent,
                createdAt: new Date(message.messagedate),
                user: <GCUser>{ _id: oUser.id, avatar: oUser.thumbnail, name: oUser.displayname }
              }

              if (message.type && message.type == 'info') {
                conv.system = true;
              }

              if (message.messageattachment && message.messageattachment != '') {
                conv.image = message.messageattachment;
              }

              return conv;
            }));
          });

          Promise.all(promises).then((values) => {
            resolve(values);
          });

Viewing all articles
Browse latest Browse all 6208

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>