javascript - 在 Angular 2 应用程序中返回 Observable,但仍然收到错误 : "Property ' subscribe' does not exist on type 'void'

标签 javascript angular typescript observable

在我的 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');
}

我正在尝试的(为了匹配来 self 们通用 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());
        }
    });
}

我收到的具体错误消息是:

Property 'subscribe' does not exist on type 'void'.

我认为如果您忘记在 api 调用中返回,就会收到这种错误消息。但我回来了,所以我不清楚我在这里做错了什么。

此外,要添加的是,我将 api 服务注入(inject)到我的构造函数中,如下所示:

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 的应用程序的其他部分如何处理此问题?

关于javascript - 在 Angular 2 应用程序中返回 Observable,但仍然收到错误 : "Property ' subscribe' does not exist on type 'void' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45513246/

相关文章:

javascript - 使用 TypeScript

javascript - 显示/隐藏具有相同类名的 Div - Javascript

javascript - 刷新带有 &lt;script&gt; 标签的 div

javascript - 使用 AngularJS 打印 JSON 值

Angular - 构建后未处理的导航错误

html - 如何将id添加到ngfor中的元素以及在ngfor中有条件地创建元素

angular - 如何使 Angular Ivy + Angular Universal 工作?

angular - 使用 REST API 时 mat-table 数据源不起作用

java - jsp页面中如何像gridview这样的多行记录中删除单条记录

date - 我如何计算 typescript 中2个日期之间的时间