簡體   English   中英

Angular5 http最佳做法

[英]Angular5 http best practices

我正在使用Angular 5構建一些應用程序(是的,一個以上)。我正在嘗試遵循Angular的所有原則

但是我看不懂幾件事

1)之間的區別...

this._http.get<User>(this._ubiRest.servicesUrls.getUser)

...和這個

this._http.get(this._ubiRest.servicesUrls.getUser)

無論如何,如果我必須使用map方法來強制轉換為User類型(或者我可能不是?)

2)在服務中這樣做會更好...

getUserData(): Observable<User> {

        return new Observable((observable) => {

            if (!!this._loggedUser) {
                observable.next(this._loggedUser);
                observable.complete();
            }
            else {
                this._http.get(this._ubiRest.servicesUrls.getUser)
                    .map(this._extractData)
                    .subscribe(user => {
                        this._loggedUser = user;
                        observable.next(user);
                        observable.complete();
                    }, this._handleError);
            }

        })
    }

...或這個?

getUserDataX(): Observable<User> {
    if (!!this._loggedUser) {
        return new Observable(observable => {
            observable.next(this._loggedUser);
            observable.complete();
        });
    }
    else {
        return this._http.get<User>(this._ubiRest.servicesUrls.getUser)
           .map(this._extractData)
           .catch(this._handleError);
    }
}

最佳實踐是使用Angular 4 HttpClient而不是Angular 2 Http OP中的代碼看起來像是HttpClient ,而不是Http

兩者之間的區別...

無論如何,我必須使用map方法強制轉換為User類型

泛型方法的要點是,泛型參數類型在內部某處使用。 這會影響可觀察的類型:

this._http.get<User>(this._ubiRest.servicesUrls.getUser)
.map(user => { /* user has User type */ })

HttpClient API中可以清楚地看到這一點; get(...)返回Observable<any>get<T>(...)返回Observable<T>

在服務中這樣做會更好...

以上都不是。 new Observable(observable => { ... })是可觀察的構造函數反模式,是諾言的構造函數反模式。 它是:

   if (!!this._loggedUser) {
        return Observable.of(this._loggedUser);
    }
    else {
        return this._http.get<User>(this._ubiRest.servicesUrls.getUser)
       .map(this._extractData)
       .catch(this._handleError);
    }

estus答案的問題在於,如果另一端有“ Finally”運算符,則該功能將不起作用,因此對我有用的是:

getUserData(): Observable<User> {
      return new Observable(observable => {
            if (!!this._loggedUser) {
                observable.next(this._loggedUser);
                observable.complete();
            }
            else {
                this._http.get<User>(this._ubiRest.servicesUrls.getUser)
                    .retry(2)
                    .map(this._mapUserResponse)
                    .subscribe(x => {
                        console.log("getUserData", x);
                        observable.next(x);
                        observable.complete();
                    }, error => {
                        console.warn("LoggedUserService error: ", error);
                        this._ubiFunctions.showSnackBar({
                            message: error.statusText
                        });
                        observable.error(error);
                    })
            }
      });
}

private _mapUserResponse(rawResponse: User) {
    this._loggedUser = rawResponse;
    return this._loggedUser;
}

我-component.ts

myGetUserData():void{
        this._progressDialog.openProgress();
        this._loggedUser.getUserData()["finally"](() => {
             this._progressDialog.closeProgress();
        }).subscribe(data => {
            this.user = data;
            this._router.navigate(['/home']);
            this._ubiFunctions.showSnackBar({
                message: "Utente caricato correttamente"
             });
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM