由于我已将我的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);
}
有人可以帮忙吗?
答案 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);
}
没有其他任何改变。