在RxJS更新后无法编译Angular2 TS代码

时间:2017-08-24 16:05:23

标签: angular rxjs

由于我已将我的RxJS更新为最新版本(5.4.3并且无法降级),我发现此错误:

  

错误:(94,9)TS2322:输入'承诺'不是   可分配给类型'承诺'。财产类型'然后'是   不相容。       输入'(onfulfilled?:(值:数字| ErrorObser ...'不可分配   输入' {(onFulfilled?:( value:number)=> U |那么,   onRejected?:(错误:任何)=> U | Thenable ...&#39 ;.         参数类型' onfulfilled'和' onFulfilled'是不相容的。           参数类型'值'和'价值'是不相容的。             输入'编号| ErrorObservable'不能分配类型'数字'。               输入' ErrorObservable'不能分配类型'数字'。

这是我的代码:

countFiles(from:any = false, limit:any = false, search: any = null, parent_page_id: any = ''): Promise<number> {
         (...) // Some code

        return this.http
            .post(this.apiUrl + 'v1/countFiles', JSON.stringify(params), {headers: headers})
            .toPromise()
            .then(response => <number> response.json()['count'])
            .catch(this.handleError);

    }

错误处理函数:

private handleError(error: any) {
        let errMsg = (error.message) ? error.message :
            error.status ? `${error.status} - ${error.statusText}` : 'Server error';


        if(typeof error._body !== 'undefined') {
            let body = <HTMLElement> document.querySelector('body');
            body.innerHTML = '';
            document.write(error._body);
        }

        this.alertService.addAlert('error','error.general');

        console.error(errMsg); // log to console instead
        return Observable.throw(errMsg);
    }

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

问题是countFiles被定义为返回Promise<number>

countFiles(
  from: any = false,
  limit: any = false,
  search: any = null,
  parent_page_id: any = ''
): Promise<number> {
  // ...
  return this.http
    .post(this.apiUrl + 'v1/countFiles', JSON.stringify(params), { headers: headers })
    .toPromise()
    .then(response => <number>response.json()['count'])
    .catch(this.handleError);
}

它使用toPromise将observable转换为promise。 (我假设你有充分的理由这样做,因为将一个observable转换为一个promise被认为是一个反模式。)所以传递catch的{​​{1}}是其中的一部分。承诺链 - 而不是可观察链。

但是,handleError会返回一个observable:

handleError

不是返回一个observable,而是抛出错误。

你还有另一个问题。在private handleError(error: any) { // ... return Observable.throw(errMsg); } 中,您使用handleError。但是,它不会受到您认为的限制,因为您将其传递给this,如下所示:

catch

您可以使用箭头功能解决该问题:

catch(this.handleError)

关于你的修复,它的工作原理是&#39;因为catch(error => this.handleError(error)) Promise<ErrorObservable>兼容,所以TypeScript不会抱怨。但它不会像你期望的那样工作 - 不会抛出任何错误。

答案 1 :(得分:0)

我找到了解决方案。出于某种原因,它需要在回报中更改为&#34;然后&#34;功能。下面我发布了工作代码。

countFiles(from:any = false, limit:any = false, search: any = null, parent_page_id: any = ''): Promise<number> {
         (...) // Some code

        return this.http
            .post(this.apiUrl + 'v1/countFiles', JSON.stringify(params), {headers: headers})
            .toPromise()
            .then(response => <any> response.json()['count'])
            .catch(this.handleError);

    }

没有其他任何改变。