创建一个同步的http.get()

时间:2015-12-28 15:37:48

标签: http typescript angular

我试图通过promises和http.get来处理登录,但是我失败了,我得到了以下错误:

  

对象不支持属性或方法' toPromise'

我的代码是:

return this.http.get('http://localhost:5000/login/', {
  headers: authHeader
}).map((response) => {
  return response.json()
}).toPromise(null);

我得到了:

https://github.com/johnpapa/angular2-there-and-back-again/blob/master/src/app/core/character.service.ts

更新:

JohnPapa将他的项目更新为我的朋友

https://github.com/johnpapa/angular2-there-and-back-again/blob/master/app/core/character.service.ts

2 个答案:

答案 0 :(得分:6)

我想知道你是否真的使用了promise,因为Angular的HTTP支持依赖于Observables。

要获得回复,您只需要为您的通话返回observable:

getSomething() {
  return this.http.get('http://localhost:5000/login/', {
    headers: authHeader
  }).map((response) => {
    return response.json()
  })
}

调用该方法时,您可以使用subscribe方法注册回调:

getSomething().subscribe(
  data => handleData(data),
  err => reject(err));

如果你真的想使用promises(使用toPromise方法),你应该导入:

import 'rxjs/Rx';

有关详细信息,请参阅此问题:Apple documentation

否则,FYI调用与浏览器中的HTTP不同步...

希望它可以帮到你, 亨利

答案 1 :(得分:0)

如果需要,可以为 sync-request 库使用TypeScript包装器。

此TypeScript强类型,流畅的包装库是 ts-sync-request

ts-sync-request on npm

使用此库,您可以进行如下同步HTTP调用:

您的TypeScript类

class Request
{
    Email: string;
}

class Response
{
    isValid: boolean;
}

在项目中安装软件包

 npm i ts-sync-request

然后

import { SyncRequestClient } from 'ts-sync-request/dist'

获取

    let email = "jdoe@xyz.com";
    let url = "http://localhost:59039/api/Movies/validateEmail/" + email;

    var response = new SyncRequestClient()
                                .addHeader("Authorization", "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NDc2OTg1MzgsIm5iZiI6MTU0NzY5NDIxOCwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6InN0cmluZyIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvcm9sZSI6InN0cmluZyIsIkRPQiI6IjEvMTcvMjAxOSIsImlzcyI6InlvdXIgYXBwIiwiYXVkIjoidGhlIGNsaWVudCBvZiB5b3VyIGFwcCJ9.qxFdcdAVKG2Idcsk_tftnkkyB2vsaQx5py1KSMy3fT4")
                            .get<Response>(url);

POST

    let url = "http://localhost:59039/api/Movies/validateEmailPost";
    let request = new Request();
    request.Email = "jdoe@xyz.com";

    var response = new SyncRequestClient()
                                .addHeader("Authorization", "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NDc2OTg1MzgsIm5iZiI6MTU0NzY5NDIxOCwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6InN0cmluZyIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvcm9sZSI6InN0cmluZyIsIkRPQiI6IjEvMTcvMjAxOSIsImlzcyI6InlvdXIgYXBwIiwiYXVkIjoidGhlIGNsaWVudCBvZiB5b3VyIGFwcCJ9.qxFdcdAVKG2Idcsk_tftnkkyB2vsaQx5py1KSMy3fT4")
                            .post<Request, Response>(url, request);

希望这会有所帮助。