【问题标题】:create a synchronous http.get()创建一个同步的 http.get()
【发布时间】:2016-04-02 11:17:34
【问题描述】:

我试图通过 Promise 和 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

【问题讨论】:

标签: http typescript angular


【解决方案1】:

如果需要,您可以为 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);

发布

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我想知道你是否真的使用了 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));
    

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

    import 'rxjs/Rx';
    

    更多详情请参阅此问题:https://github.com/angular/angular/issues/5632#issuecomment-167026172

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

    希望对你有帮助 蒂埃里

    【讨论】:

    • 找不到哪个函数?你用过导入吗?我这边没有这个错误... ;-)
    猜你喜欢
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    相关资源
    最近更新 更多