Angular 2 - 直接从Observable返回数据

Sid*_*iel 29 observable rxjs typescript angular

我一直在试图解决这个问题,而且我已经能够阅读的任何文档都没有给我一个问题的答案.

我有一个直接与API通信并返回可观察事件的服务,在正常情况下我会订阅并按照数据执行我想要的操作,但是在使用来自restful服务的请求的辅助服务中,我需要能够从请求中返回值.

getSomething() {
    return this._restService.addRequest('object', 'method').run()
        .subscribe(
            res => {
                res;
            },
            err => {
                console.error(err);
            }
        );
}

returnSomething() {
    return this.getSomething();
}
Run Code Online (Sandbox Code Playgroud)

在上面的快速示例中,我想知道是否有任何方法可以resgetSomething()内部返回returnSomething().如果以这种方式无法实现,那么替代方案是什么?我将补充说,_restService非常依赖,我真的不想开始搞乱它.

rin*_*usu 43

由于http调用等是异步的,因此Observable返回一个而不是同步值.你必须订阅它,并在那里的回调中获得数据.没有办法解决这个问题.

一种选择是将您的逻辑放在subscribe通话中

getSomething() {
    return this._restService.addRequest('object', 'method').run()
        .subscribe(
            res => {
                // do something here
                res;
            },
            err => {
                console.error(err);
            }
        );
}
Run Code Online (Sandbox Code Playgroud)

但我喜欢这样做的方法是添加一个回调,从外部注入逻辑(可能是一个组件,也许是另一个服务):

getSomething(callback: (data) => void) {
    return this._restService.addRequest('object', 'method').run()
        .subscribe(
            res => {
                callback(res);
            },
            err => {
                console.error(err);
            }
        );
}
Run Code Online (Sandbox Code Playgroud)

在您的组件或任何地方:

this._yourService.getSomething((data) => {
    // do something here
    console.log(data);
});
Run Code Online (Sandbox Code Playgroud)

  • 绝对是一种考虑使用服务的新方法,结果正是所需要的! (3认同)
  • 大约需要几个小时来弄清楚错误.谢谢你的回答. (2认同)