【问题标题】:Convert Promise object to JSON in Angular 2在 Angular 2 中将 Promise 对象转换为 JSON
【发布时间】:2017-02-27 22:25:11
【问题描述】:

我正在尝试进行 HTTP POST,然后检查响应以查看它是失败还是成功。

HTTP 调用如下所示:

doLogin(credentials) {
    var header = new Headers();
    header.append('Content-Type', 'application/x-www-form-urlencoded');
    var body = 'username=' + credentials.username + '&password=' + credentials.password;
    return new Promise((resolve, reject) => {
        this.http.post(this.url, body, {
            headers: header
        })
            .subscribe(
                data => {
                    resolve(data.json());
                },
                error => {
                    resolve(error.json());
                }
            );
    });

}

这个函数的调用如下:

data: Object;
errorMessage: Object;

login($event, username, password) {
    this.credentials = {
        username: username,
        password: password
    };

    this._loginService.doLogin(this.credentials).then(
        result => {
            this.data = result;
            console.log(this.data);
        },
        error => {
            this.errorMessage = <any>error;
            console.log(this.errorMessage);
        });
}

在 Chrome 控制台上,数据如下:

Object {status: "Login success", token: "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJjcmlzdGkiLCJ1c2VyS…blf1AzZ6KzRWQFNGXCrIeUHRG3Wrk7ZfCou135WmbVa15iYTA"}

如何访问 Angular 2 中的状态?因为如果我尝试访问this.data.status,它就无法正常工作。

我应该创建一个具有状态和令牌属性的类吗?

【问题讨论】:

  • 在哪里你想访问this.data.status?在回调内部?你知道“异步”是什么意思吗,或者为什么你必须订阅和提供回调?
  • 你可以试试下面的。将 result =&gt; 更改为 (result:any) =&gt; 。然后console.log(this.data.status);
  • 什么不起作用?有错误信息吗?你可以创建一个不需要类的接口。
  • @jonrsharpe 我必须使用 subscribe 才能完成 http 请求,不是吗?

标签: json angular angular2-http


【解决方案1】:

要回答您的问题,您可以使用从 http 订阅 observable 中可用的 response.okboolean。

因此,根据您的代码,您可以将data 对象直接传递给promise,并在解析data.json 之前检查data.ok

//...
return new Promise((resolve, reject) => {
    this.http.post(this.url, body, {
        headers: header
    })
        .subscribe(resolve,
         error => {
                reject(error.json());
            }
        );
});

// then you would have something like this:

this._loginService.doLogin(this.credentials).then(
    result => {
        if (result.ok) {
            this.data = result;
            console.log(this.data);
        }
    },
    error => {
        this.errorMessage = <any>error;
        console.log(this.errorMessage);
    })

建议

现在,我建议您摆脱承诺,因为我相信您并不真的需要它。使用您的服务的任何人都可以订阅 http 帖子返回的 observable,如下所示:

doLogin(credentials) {
    let header = new Headers();
    header.append('Content-Type', 'application/x-www-form-urlencoded');
    var body = 'username='+credentials.username+'&password='+credentials.password;
    return this.http.post(this.url, body, { headers: header });
}

然后,登录时:

login($event, username, password) {
    this.credentials = {
        username: username,
        password: password
    };

    this._loginService.doLogin(this.credentials).subscribe(response => {
        if (response.ok) { // <== CHECK Response status
            this.data = response.json();
            console.log(this.data);
        } else {
            // handle bad request
        }
    },
    error => {
        this.errorMessage = <any>error;
        console.log(this.errorMessage);
    });
}

希望这会有所帮助!

【讨论】:

  • 好的,这可行,但是如何从数据响应中获取我的令牌?
  • 如果您使用我建议的方法,您应该可以通过response.json() 访问它,因此类似于var token = this.data.token。您可以通过调试器检查响应对象。
  • 我设法通过创建一个与 response.json () 具有相同属性的空 json 来访问令牌。谢谢
【解决方案2】:

你可以这样做:

data: Object;
errorMessage: Object;

login($event, username, password) {
    this.credentials = {
        username: username,
        password: password
    };

    this._loginService.doLogin(this.credentials).then(
        (result: any) => {
            this.data = result;
            console.log(this.data);
            console.log(this.data.status);
        },
        error => {
            this.errorMessage = <any>error;
            console.log(this.errorMessage);
        });
}

result 设置为键入任何内容。这样您就可以访问status,但是如果您愿意,您可以创建一个class 并在您的service 中使用rxjs/map 来填充class

【讨论】:

  • /Users/cristi/licenta/onlinebanking-frontend/src/app/login/login.component.ts (41,39) 中的错误:“对象”类型上不存在属性“状态” .)
猜你喜欢
  • 2016-08-15
  • 2018-12-10
  • 2019-11-06
  • 2019-11-07
  • 1970-01-01
  • 2021-05-23
  • 2016-11-17
  • 1970-01-01
相关资源
最近更新 更多