简体   繁体   English

Angular5 http最佳做法

[英]Angular5 http best practices

I'm building some applications (yes, more than one) with Angular 5. I'm trying to follow all of Angular dos and don'ts 我正在使用Angular 5构建一些应用程序(是的,一个以上)。我正在尝试遵循Angular的所有原则

But I can't understand a couple things 但是我看不懂几件事

1) Difference between this... 1)之间的区别...

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

...and this ...和这个

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

If anyway I have to do use the map method to cast to type User (or maybe I don't??) 无论如何,如果我必须使用map方法来强制转换为User类型(或者我可能不是?)

2) In a service would be better to do this... 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);
            }

        })
    }

...or this? ...或这个?

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);
    }
}

A 'best practice' is to use Angular 4 HttpClient instead of Angular 2 Http . 最佳实践是使用Angular 4 HttpClient而不是Angular 2 Http And the code in OP looks like it's HttpClient , not Http . OP中的代码看起来像是HttpClient ,而不是Http

Difference between this... 两者之间的区别...

If anyway I have to do use the map method to cast to type User 无论如何,我必须使用map方法强制转换为User类型

The point of generic method is that generic parameter type is used somewhere internally. 泛型方法的要点是,泛型参数类型在内部某处使用。 Here it affects the type of observable: 这会影响可观察的类型:

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

This can be clearly seen in HttpClient API ; HttpClient API中可以清楚地看到这一点; get(...) returns Observable<any> and get<T>(...) returns Observable<T> . get(...)返回Observable<any>get<T>(...)返回Observable<T>

In a service would be better to do this... 在服务中这样做会更好...

None of the above. 以上都不是。 new Observable(observable => { ... }) is observable constructor antipattern, a counterpart to promise constructor antipattern. new Observable(observable => { ... })是可观察的构造函数反模式,是诺言的构造函数反模式。 It is: 它是:

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

The problem with estus answer is that it doesn't work if you have a "Finally" operator on the other side, so what worked for me was this: 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;
}

my-component.ts 我-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