Ionic 3如何确保在加载视图之前获取db数据 [英] Ionic 3 How to ensure db data fetched before view is loaded

查看:75
本文介绍了Ionic 3如何确保在加载视图之前获取db数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用基于令牌的身份验证,并且令牌已经保存在数据库上。

I'm using token based authentication and token is already saved on DB.

当应用启动时,我需要从数据库中获取令牌并在之前使其可用进行API调用。

When app starts, I need to fetch the token from DB and make it available before making API calls.

最好的方法是:

在组件中:

ngOnit() {
storage.get('token').then((val) => {
    Make api call here 
});
}

或在共享服务中:

getToken() {
    return Promise((resolve, reject)=>{
       #if fetched once save in local var and resolve token  
       #or fetch from DB and resolve token  
    })
}

// On Component
this.sharedService.getToken().then((token)=>{
  //Make api call
}

有没有我可以确保在加载视图之前获取DB令牌并存储在共享服务中吗?storage.get是'ES6 promise'

Is there any way I can ensure the DB token is fetched and store in shared services before view is loaded? The storage.get is a 'ES6 promise'

关注是加载令牌的责任在加载视图之前升级到任何bootstrapping事件,因此onViewLoad不需要在每个组件中定义。

Concern is responsibility of loading token before loading view is escalated to any bootstrapping event, so onViewLoad doesn't needs to be defined in each component.

推荐答案

我有以这种方式实现上面的用例。

I have implemented above use case in this way.

我为 CRUD创建了 ApiService 如下所示。代码是不言自明的,如果您需要更多信息,请告诉我。

I have created ApiService for CRUD like below.That code is self-explanatory and if you need more info please let me know.

api-service.ts

import { Injectable, } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import { Headers, RequestOptions, BaseRequestOptions } from '@angular/http';
import { Storage } from '@ionic/storage';
import { Events } from 'ionic-angular';

@Injectable()
export class ApiService {

    constructor(private http: Http, private storage: Storage, private events: Events) { }

    createHeader(headers: Headers) {
        return new Promise((resolve, reject) => {
            this.storage.get('loggedInUser')
                .then((token: any) => {
                    if (token) headers.append('Authorization', 'token ' + token.token);
                    resolve(headers);
                }, err => {
                    resolve(headers);
                });
        });
    }

    get(api) {
        let header = new Headers();
        return Observable.fromPromise(this.createHeader(header))
            .map(() => {
                let options = new BaseRequestOptions();
                options.withCredentials = true;
                options.headers = header;
                return options
            })
            .switchMap((options) => this.http.get(api, options))
            .catch((err: Error | Response) => {
                if (err instanceof Response && err.status === 401) {
                    this.events.publish('token-expiration');
                }
                return Observable.throw(err);
            });
    }

    post(url, params): Observable<any> {
        return new Observable(observer => {
            let header = new Headers();
            this.createHeader(header)
                .then(() => {
                    let options = new RequestOptions({ headers: header });
                    this.http.post(url, params, options)
                        .subscribe(response => {
                            observer.next(response);
                            observer.complete();
                        }, (e) => {
                            observer.error(e);
                        });
                })
        })
    }

    delete(url) {
        return new Observable(observer => {
            let header = new Headers();
            this.createHeader(header)
                .then(() => {
                    return this.http.delete(url, { headers: header, withCredentials: true })
                        .subscribe(response => {
                            observer.next(response);
                            observer.complete();
                        });
                })
        });
    }

}

这里我创建了<$ c当用户登录app时,$ c> loggedInUser 存储。它也是提供商,如下所示。

Here I have created loggedInUser storage when the user logged into the app.It is also a provider as shown below.

social-login.ts

import { Injectable } from '@angular/core';
import { ApiService } from "../providers";
import { LocalCacheServiceProvider } from "../local-cache-service/local-cache-service";
import { UserService } from "../user-provider";
import { Storage } from '@ionic/storage';


@Injectable()
export class SocialLoginProvider {

  constructor(private apiService: ApiService, private localCacheService: LocalCacheServiceProvider, private userService: UserService, private storage: Storage) {
  }

  //login To App
  loginToApp(url: string, data: string) {
    this.apiService.post(url, { access_token: data })
      .map((res: any) => res.json())
      .subscribe(res => {
        this.setUserLocally(res);
      });
  }

  //set User Locally
  setUserLocally(user) {
    this.localCacheService.clearAllKeys().then(() => {
      this.userService.setLoggedInUser(user);
      this.storage.set('loggedInUser', user);
    });
  }
}

之后,我可以消费以上服务(即 ApiService )通过我的任何提供商(对于 CRUD 操作)如下所示。

After that, I can consume above service (i.e. ApiService) through any of my provider (for CRUD operations) as shown below.

这是 ArticleService

article-service.ts

import { Injectable } from '@angular/core';
import { Observable } from "rxjs/Observable";
import 'rxjs/add/operator/map';
import { config } from '../config/config';
import { ApiService } from './api-service';


@Injectable()
export class ArticleService {

    constructor(private apiService: ApiService) {
    }

   getBookById(id) {
        return this.apiService.get(`${config.getBookById}${id}/`).map((res: any) => res.json());
    }  
}

以上方法对我来说完全没问题。希望这种方法也会帮助你。如果你需要更多帮助,请告诉我。

Above approach works perfectly fine for me.Hope this approach will help you too.If you need more help please let me know.

这篇关于Ionic 3如何确保在加载视图之前获取db数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆