Javascript 在Angular 2应用程序中返回一个可观测值,但仍然得到错误:“1”;财产';订阅';不存在于类型';无效';

Javascript 在Angular 2应用程序中返回一个可观测值,但仍然得到错误:“1”;财产';订阅';不存在于类型';无效';,javascript,angular,typescript,observable,Javascript,Angular,Typescript,Observable,在我的Angular 2应用程序中,我在服务层中使用了一个可观察到的,然后在组件层中订阅该可观察到的。我最初的设置是有效的,但现在我正在尝试调整语法,以匹配我们在整个应用程序中使用的universal api.service函数签名参数。到目前为止,我还无法让它使用新的签名/语法 首先,这是我所拥有的(正在工作的): 我正在尝试(为了匹配来自我们universal api.service的调用签名)但不起作用的是: getByFilter(page, pagesize, body) {

在我的Angular 2应用程序中,我在服务层中使用了一个可观察到的,然后在组件层中订阅该可观察到的。我最初的设置是有效的,但现在我正在尝试调整语法,以匹配我们在整个应用程序中使用的universal api.service函数签名参数。到目前为止,我还无法让它使用新的签名/语法

首先,这是我所拥有的(正在工作的):

我正在尝试(为了匹配来自我们universal 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());
        }
    });
}
我收到的具体错误消息是:

类型“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);
}