Angular 导入rxjs后,toPromise不是一个函数

Angular 导入rxjs后,toPromise不是一个函数,angular,typescript,rxjs,angular-promise,Angular,Typescript,Rxjs,Angular Promise,我想使用承诺操作符 首先,我介绍了rxjs: import 'rxjs/add/operator/toPromise'; 然后在我的组件中,我使用了它 ngOnInit() { this.EJnames= this.dataservice.getResults(); this.generalinfosservice.getResults("nothing").then(data=>{this.data=data; console.log(data)}); //Log 1

我想使用承诺操作符

首先,我介绍了rxjs:

import 'rxjs/add/operator/toPromise';
然后在我的组件中,我使用了它

ngOnInit() {
    this.EJnames= this.dataservice.getResults();
    this.generalinfosservice.getResults("nothing").then(data=>{this.data=data; console.log(data)}); //Log 1
 console.log(this.data); // log 2
  }
我犯了这个错误

ERROR TypeError: this.generalinfosservice.getResults(...).toPromise is not a function
我已经检查了Package.json我已经检查了rxjs:

"rxjs": "^5.1.0",
下面是
generalinfosservice.getresults
函数

import { Injectable } from '@angular/core';
import { RmpmService}  from '../../shared/abstract-classes/service'
import { HttpClient } from '@angular/common/http';

@Injectable()
export class GeneralinfosService extends RmpmService {

  constructor(public httpClient: HttpClient) { }
    public getResults(body) {
        let url;
        let mockUrl
            url = '/obtenirNomenclatures/typeNomenclatures/';
            mockUrl = 'assets/data/group.json';

    return this.post(url, mockUrl, body);
    }
}
以及抽象类中的post函数:

post( url, mockUrl, body) {
    if( environment.mocked ) {
        return this.httpClient.get( mockUrl ).toPromise().then( data => { return data} );
    } else {
        return this.httpClient.post( url, JSON.stringify( body ) )
            .toPromise()
            .then( data => {
                return data;
            }, ( err: any ) => {
                return this.handleError( err.message );
            } );
    }
}

PS:我在模拟环境中

你在
getResults()中调用
this.post()
。这将在类(
GeneralInfoService
)中查找名为
post()
的方法

您实际需要调用的是
this.httpClient.post()

//需要导入此文件才能使下面的修复程序正常工作:
从“rxjs/Observable”导入{Observable};
//您当前的“post”方法。
post(url、mockUrl、正文){
if(environment.mocked){
//在您的承诺中,您没有返回另一个承诺。您只返回“data”值,该值没有关联的“.then()”函数。
//返回this.httpClient.get(mockUrl.toPromise().then(data=>{returndata});
//以下是您应该如何做到这一点:
返回此.httpClient.get(mockUrl)
.toPromise()
然后((数据)=>可观察的(数据).toPromise());
}否则{
返回此.httpClient.post(url,JSON.stringify(body))
.toPromise()
.那么(
(数据)=>可观察到的(数据).toPromise(),
(err:any)=>this.handleError(err.message)
);
}

}
能否显示GeneralInfo.getResults的类型或实现?能否显示
此.post
方法?您的
此.post
方法返回的是一个承诺,而不是一个可观察的承诺,因此我不需要在我的组件中使用另一个承诺,对吗?是的,你可以去掉组件中的
toPromise
调用,因为此时它已经是一个了。通过记录控制台调用的响应,您应该能够看到我意识到我不需要在infosgeneral组件中使用toPromise()方法,因为post方法已经在这样做了。你能向我证实吗?哎呀,我不知道你声明了一个名为post()的方法。是的,因为post()返回数据本身(不是可观察的),所以不需要对其调用toPromise()。但是,您需要等待它(如果是异步函数)或调用。然后在resultIt上,不需要在实现方法中返回承诺。只需返回一个值就可以正常工作。Promissions的文档说明:“在调用处理程序函数之后,如果处理程序函数返回一个值,那么返回的承诺将得到解析,返回的值将作为其值”@DanielWStrimpel=>这对于JavaScript本机承诺是正确的,但是我不是100%确信RxJS库在后端使用它们,这就是为什么我要按现在的方式设置它。是的,这可能是不必要的,但它保证返回一个承诺,因为
Observable.of(val).toPromise()
正在将新创建的Observable转换为一个承诺,该承诺保证具有
.then()
方法。根据RxJS文档,它保证以这种方式运行。“将可观测序列转换为符合ES2015的承诺。”