![](/img/trans.png)
[英]Property 'subscribe' does not exist on type 'void' in angular 2
[英]Returning an Observable in Angular 2 App, but still getting error: "Property 'subscribe' does not exist on type 'void'
在我的Angular 2应用程序中,我在服务层中使用了一个可观察对象,然后在组件层中订阅了该可观察对象。 我最初的设置工作正常,但是现在我试图调整语法以匹配我们在整个应用程序中使用的通用api.service函数签名参数。 到目前为止,我还无法使其与新的签名/语法一起使用。
首先,这是我所拥有的(正在工作):
getByFilter(page, pagesize, body) {
const headers = new Headers({ 'Content-Type': 'application/json' });
const options = new RequestOptions({ headers: this.headers });
return this.http.post
(`${this.url}${this.ver}/clients/search/custom?apikey=${this.key}&page=${page}&pagesize=${pagesize}`,
body, options)
.map((res: Response) => res.json())
.catch(this.filterErrorHandler);
}
filterErrorHandler(error: Response) {
console.error(error);
return Observable.throw(error.json().error || 'Server error');
}
而我正在尝试(为了匹配来自我们通用api.service的呼叫签名)是不起作用的:
getByFilter(page, pagesize, body) {
const headers = new Headers({ 'Content-Type': 'application/json' });
const options = new RequestOptions({ headers: this.headers });
return this.api.post({
req: 'clients/search/custom',
callback: (results) => {
if (!results.ok) {
console.error(results);
return Observable.throw(results.data.json().error || 'Server error');
}
console.error(results);
return Observable.from(results.data.json());
}
});
}
我收到的特定错误消息是:
属性“ subscribe”在类型“ void”上不存在。
我认为如果您忘记返回api调用,就会收到这种错误消息。 但是我要回来了,所以我不清楚我在做什么错。
另外,要添加的是,我将api服务注入到我的构造函数中,如下所示:
constructor(private http: Http, private api: API) {}
API服务中的post调用具有一个如下所示的调用签名:
public post(params: {
req: string,
reqArgs?: any,
reqBody?: any,
callback?: IRequestCallback
})
{
params['reqType'] = 'post';
this.runHttpRequest(params);
}
/**
* Internal method used within the service to perform
* an HTTP request to the API
*
* @param params
*/
private runHttpRequest(params: {
req?: string,
reqArgs?: any,
reqBody?: any,
callback?: IRequestCallback,
reqType?: string
})
{
let {req, reqArgs, callback, reqBody, reqType} = params;
// Check request string
if (String.isNullOrEmpty(req)) throw 'Undefined request';
// Initialize options if undefined
if (!reqArgs) reqArgs = {};
// Build URL
let route = this.buildRequestUrl(req, reqArgs);
if (this.http[reqType] === undefined) throw 'Cannot process HTTP request, undefined request type';
// Call HTTP
this.http[reqType](route, reqBody)
.map(function (res: Response)
{
let r: IResponse =
{
ok: res.ok,
status: res.status,
statusText: res.statusText
};
let body = null;
try
{
body = res.json();
}
catch (err)
{
}
r.data = body || res;
// Content cleanup; If a data property is provided within the
// body of the response, then we use that
// information as the data requested.
if ('data' in r.data)
{
Object.assign(r, r.data);
}
return r;
})
.catch(function (error: any)
{
let errMsg = (error.message) ? error.message :
error.status ? `${error.status} - ${error.statusText}` : 'Server error';
if (callback) callback(error);
return Promise.reject(errMsg);
})
.subscribe(function (args: any)
{
if (callback) callback(<IResponse> args);
});
}
这是我在组件中订阅的示例(这是发生错误的地方):
ngOnInit() {
this.clientService.getByFilter(this.page, this.pagesize, {
})
.subscribe(resRecordsData => {
this.records = resRecordsData;
console.log(this.records);
},
responseRecordsError => this.errorMsg = responseRecordsError);
}
您正在返回api.post
方法的返回值:
return this.api.post()
此方法不返回Observable。 实际上,它看起来根本没有返回任何内容:
public post(params: {
req: string,
reqArgs?: any,
reqBody?: any,
callback?: IRequestCallback
})
{
params['reqType'] = 'post';
this.runHttpRequest(params);
}
这就是为什么您收到看到的错误的原因。 应用中使用此API的其他部分如何处理此问题?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.