Javascript 在Angular 2应用程序中返回一个可观测值,但仍然得到错误:“1”;财产';订阅';不存在于类型';无效';
在我的Angular 2应用程序中,我在服务层中使用了一个可观察到的,然后在组件层中订阅该可观察到的。我最初的设置是有效的,但现在我正在尝试调整语法,以匹配我们在整个应用程序中使用的universal api.service函数签名参数。到目前为止,我还无法让它使用新的签名/语法 首先,这是我所拥有的(正在工作的): 我正在尝试(为了匹配来自我们universal api.service的调用签名)但不起作用的是:Javascript 在Angular 2应用程序中返回一个可观测值,但仍然得到错误:“1”;财产';订阅';不存在于类型';无效';,javascript,angular,typescript,observable,Javascript,Angular,Typescript,Observable,在我的Angular 2应用程序中,我在服务层中使用了一个可观察到的,然后在组件层中订阅该可观察到的。我最初的设置是有效的,但现在我正在尝试调整语法,以匹配我们在整个应用程序中使用的universal api.service函数签名参数。到目前为止,我还无法让它使用新的签名/语法 首先,这是我所拥有的(正在工作的): 我正在尝试(为了匹配来自我们universal api.service的调用签名)但不起作用的是: getByFilter(page, pagesize, body) {
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());
}
});
}
我收到的具体错误消息是:
类型“void”上不存在属性“subscribe”
我认为如果忘记在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);
});
}
您正在返回
api的返回值。post
方法:
return this.api.post()
此方法不返回可观察的。实际上,它看起来根本没有返回任何内容:
public post(params: {
req: string,
reqArgs?: any,
reqBody?: any,
callback?: IRequestCallback
})
{
params['reqType'] = 'post';
this.runHttpRequest(params);
}
这就是为什么您会收到看到的错误。使用此API的应用程序的其他部分是如何处理此问题的?您在哪里
订阅它,以及您在哪一行收到此错误?请在上面添加。您能帮助我了解此方法吗。post
方法及其参数的主要作用是什么。我假设这是OP的问题,而不是我的问题?你没有错:-)。。。我只是不清楚你是问我还是问手术?更清楚的是,如果你问OP,考虑一下他们的名字(用@)或者询问他们的原始帖子。我从上面的API服务中添加了更多代码。为了澄清情况,一位同事设置了api服务。我使用我自己的服务结构来处理可观察的事物——这是我首先列出的,这是有效的。我试图找到使用api服务的最简单实现,这样我们就可以确保所有调用都通过该根级别的服务。除非您的同事修改api服务的post方法以返回可观察的。。。我认为您的组件代码无法订阅。看起来,它将需要履行承诺。
return this.api.post()
public post(params: {
req: string,
reqArgs?: any,
reqBody?: any,
callback?: IRequestCallback
})
{
params['reqType'] = 'post';
this.runHttpRequest(params);
}