繁体   English   中英

在Angular 2 App中返回一个Observable,但仍然出现错误:“ void”类型不存在“属性“ subscribe”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM