Как сделать так, чтобы подписка на данные после канала передавала значение в rxjs6? - PullRequest
0 голосов
/ 01 ноября 2019
"rxjs": "^6.5.3"

У меня есть rxInit() данные AsyncStorage.

Я хочу использовать данные, которые я получаю, чтобы на экране отображался логин или домашний экран.

Вот моя основная функция:

AppService.shared.rxInit().pipe(map((value) => {
  console.log('value is ->', value); // I get a random string here like 'a0a2a33d-eb05-49b9-ad6e-3c199a7d5e11'

  return UserService.shared.rxInit().subscribe();

})).subscribe(() => {

  // I want the return function UserService.shared.rxInit().subscribe() finish get the data then subscribe my next function isLogin() 
  if (UserService.shared.isLogin()) {
    console.log('has Login');
    navigation.navigate('MainStack'); // to Home
  } else {
    console.log('need Login');
    navigation.navigate('Login'); // to Login
  }      
});

StorageService.shared. get () является наблюдаемой:

  get(key) {
    return (
      from(storage.load({key: key}))
        .pipe(catchError(error => of(null)))
        .pipe(map((value) => value))
    );
  }

о AppService.shared.rxInit ()

rxInit() {
    return StorageService.shared.get('deviceuuid'
      ).pipe(
        mergeMap((deviceuuid) => {
          if (deviceuuid == null) {
            this.deviceuuid = uuid();
            return StorageService.shared.set('deviceuuid', this.deviceuuid);
          } else {
            // code run here , because I have deviceuuid in my case.
            this.deviceuuid = deviceuuid;
            return of(this.deviceuuid);
          }
      }), 
      tap({ next: result => {
        console.log('rxInit deviceuuid result', result);
      }, error: error => {
        console.log('rxInit deviceuuid on error', error.message);
      },
        complete: () => console.log('rxInit deviceuuid on complete')  // it complete.
      })
    );

о UserService.shared.rxInit (). subscribe ()

rxInit() {
    console.log('rxInit start');

    return combineLatest(
      myObservable1,
      myObservable2
    ).pipe(
        mergeMap((result) => {
        console.log('My storage rxInit result =>', result); 
        const [token, email] = result;
        this.token = token;
        this.email = email;
        console.log('rxInit token', token)
        console.log('rxInit email', email)

        if (this.token != null && this.email != null) {
          return this.getUserInfo(pid, provider);
        } else if (this.token != null && this.uid != null) {
          return this.getUserInfo(pid, provider);
        } else {
          return of(null);
        }
      }),
      tap({ next: result => {
        console.log('rxInit user result', result);
      }, error: error => {
        console.log('rxInit user on error', error.message);
      },
        complete: () => console.log('rxInit user on complete')
      })
    );
  }

о UserService.shared.isLogin ()

isLogin() {
    console.log('isLogin =>');
    console.log('this.enail', this.email);
    console.log('this.token', this.token);

    if(this.email != null) {
      // return true or false depend my logic
    }

    // return true or false depend my logic
  }

Моя проблема My storage rxInit result => всегда происходит после isLogin =>.

enter image description here

Как мне убедиться, что isLogin => после My storage rxInit result =>?

Буду признателен за любую помощь.

...