【问题标题】:calling a service angular2 error 'Property 'then' does not exist on type 'Subscription'调用服务 angular2 错误“属性”在“订阅”类型上不存在
【发布时间】:2017-03-13 09:03:27
【问题描述】:

我正在尝试从我的 login.ts 调用服务,但我不断收到不同的错误。这是我的代码

login.ts

import { Component } from '@angular/core';
import { Auth, User } from '@ionic/cloud-angular';
import { NavController } from 'ionic-angular';
import { Storage } from '@ionic/storage';
import { TabsPage } from '../tabs/tabs';
import { AuthService } from '../../services/auth/auth.service';
import {Observable} from 'rxjs/Rx';


@Component({
  templateUrl: 'login.html'
})

export class LoginPage {
    authType: string = "login";
    error: string;
    storage: Storage = new Storage();

  constructor(public auth: Auth, public user: User, public navCtrl: NavController, public authService: AuthService) {}

  facebookLogin() {
    this.auth.login('facebook').then((success) => {
        this.authService.signup(this.user.social.facebook).then((success) => {

        });
    });

  }
}

auth.service.ts

import { Storage } from '@ionic/storage';
import { AuthHttp, JwtHelper, tokenNotExpired } from 'angular2-jwt';
import { Injectable, NgZone } from '@angular/core';
import { Observable } from 'rxjs/Rx';
import { Http, Headers } from 'angular2/http';

@Injectable()
export class AuthService {

  jwtHelper: JwtHelper = new JwtHelper();
  // contentHeader = new Headers({"Content-Type": "application/json"});
  storage: Storage = new Storage();
  refreshSubscription: any;
  user: Object;
  zoneImpl: NgZone;
  idToken: string;
  error: string;

  constructor(private authHttp: AuthHttp, zone: NgZone) {
    this.zoneImpl = zone;
    // Check if there is a profile saved in local storage
    this.storage.get('profile').then(profile => {
      this.user = JSON.parse(profile);
    }).catch(error => {
      console.log(error);
    });

    this.storage.get('id_token').then(token => {
      this.idToken = token;
    });
  }

  public authenticated() {
    return tokenNotExpired('id_token', this.idToken);
  }

  public signup(params) {
    var url = 'http://127:0.0.1:3000/api/v1/register';
    return this.authHttp.post(url, JSON.stringify(params))
        .map(res => res.json())
        .subscribe(
          data => {this.storage.set('id_token', data.token)},
          err => this.error = err
        );
  }
}

所以基本上我想要的是当单击facebookLogin() 时,它转到auth.service.ts 并获取返回值的singup() 方法。

但我不断收到Property 'then' does not exist on type 'Subscription'.

这是什么意思,我该如何解决?

【问题讨论】:

  • 在我看来,您的 auth.login 正在返回一个可观察的而不是一个承诺。

标签: angular typescript ionic-framework ionic2


【解决方案1】:

改订阅toPromise()(别忘了导入toPromise

  public signup(params) {
    var url = 'http://127:0.0.1:3000/api/v1/register';
    return this.authHttp.post(url, JSON.stringify(params))
        .map(res => res.json())
        .toPromise(
          data => {this.storage.set('id_token', data.token)},
        );
  }

或发送至.map(),然后在呼叫站点上使用subscribe() 而不是then()

 public signup(params) {
    var url = 'http://127:0.0.1:3000/api/v1/register';
    return this.authHttp.post(url, JSON.stringify(params))
        .map(res => {
          let data = res.json();
          this.storage.set('id_token', data.token);
          return data;
        });
  }
  facebookLogin() {
    this.auth.login('facebook').then((success) => {
        this.authService.signup(this.user.social.facebook).subscribe((success) => {

        });
    });

  }

【讨论】:

  • 您的解决方案有效,但我能知道为什么我的解决方案错了吗?仍在尝试掌握 angular2。
  • .then()Promise 上可用,但signup 返回ObservabletoPromiseObservable 创建一个Promise,这使得then() 工作,或者(我的第二种方法)你只需坚持使用Observable 并使用像subscribe()map() 这样的可观察对象的运算符。
  • 我的代码中有一些错误(第一个示例我删除了toPromise(...) 中的error ... 行,在第二个示例中我在map(...) 中添加了return data;,否则订阅者可能不会接收任何数据(或者更确切地说是this.storage.set(...) 返回的数据。
猜你喜欢
  • 2020-09-12
  • 1970-01-01
  • 2018-01-29
  • 2019-01-03
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多