【问题标题】:Angular 2: Observable not returning the object (nested) from serviceAngular 2:Observable 不从服务返回对象(嵌套)
【发布时间】:2017-03-24 03:16:24
【问题描述】:

我有一个返回用户对象的角度服务。用户对象有自己的属性加上一组墙。该服务向调用组件返回一个可观察对象。在服务中,我可以从 http 服务返回的 json 创建一个用户对象。但是,当我在我的组件中订阅服务时,返回的对象为 null。我在这里做错了什么?

// user.ts

import { wall } from './wall';

export class user {
    Id: number;
    EntryType: number;
    UserType: number;
    SubscriptionType: number;
    IsCoach: boolean;
    Username: string;
    Email: string;
    Name: string;
    Password: string;
    Created: string;
    MemberWalls: wall[];
}
//wall.ts
export class wall {
    Title: string;
    ViewItem_Id: number;
}
//authentication.service.ts

authenticate(authRequest: login): Observable<user> {
        let url: string = this.apiUrl + AppSettings.LOGIN_SERVICE;
        let headers = new Headers({
            'Content-Type': AppSettings.CONTENT_TYPE_HEADER, //'; charset=utf-8',
            'client-secret': AppSettings.CLIENT_SECRET,
            'client-id': AppSettings.CLIENT_ID
        });

        let options = new RequestOptions({ headers: headers });

        return this._http.post(url, authRequest, options) // 
            .map(data => {
                this.authenticated(data);
            })
            .catch(this.handleError);

    }

    private authenticated(res: Response) {
        let body = res.json();
        if (body.StatusCode === 200) {
            localStorage.setItem('auth_token', res.headers.get("access-token"));
            let user1: user = body.Data;
            //The user object is fine here. 
            //That means that the json and the user class structure match perfectly
            console.log(user1);
            return body.Data || {};
        }
        else {
            return {};
        }
    }
//login.component.ts

login() {
        this.errorMessage = '';
        this.currentUser = null;

            this._authService.authenticate(this.loginModel)
                .subscribe(user1 => this.currentUser = user1,
                error => this.handleError( error));

  //The user1 returned by the service is always null.
    }

【问题讨论】:

  • 你怎么知道它是空的?
  • user1 =&gt; this.currentUser = user1, 是数据到达时调用的函数。您发表评论的地方的代码在此之前执行很长时间。

标签: angular typescript nested observable angular2-services


【解决方案1】:

映射发布请求的结果时,您缺少 return 语句。

在 es6 和 ts 中:

  • 当使用方括号定义箭头函数时,return 语句是强制性的。
  • 当箭头函数定义为不带括号时,es6 会自动生成一个 return 语句,返回箭头符号后提供的表达式的值

例如:

let f = (data) => this.authenticated(data);;
// Or 
let f = (data) => { return this.authenticated(data); };

【讨论】:

  • 我认为这至少对尝试@Shilpa Nagavara 很有用。
【解决方案2】:

接受 Gunter 的回答:

user1 =&gt; this.currentUser = user1,是数据到达时调用的函数。您发表评论的地方的代码在此之前执行很长时间

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    相关资源
    最近更新 更多