当前位置: 首页 > 知识库问答 >
问题:

如何从订阅服务器函数中获取返回值?

万俟穆冉
2023-03-14

我正在调用一个函数,其中有一个订户函数。此函数必须返回一个数组,但它给出了一个错误:

缺少订阅。

get():obeservable<cat[]>{
       return this.service.getsamples().subscriber(response=>{
              return <cat[]>(response);
       });
}

getSamples(){
       return this.http.get(this.url)
            .map(response=>{
             return <cat[]>response
            });
}

如何做到这一点?

共有2个答案

堵琨
2023-03-14

简单的可观察设置类似于:

@Injectable()
export class SomeService {
  constructor(private readonly httpClient: HttpClient) {}

  public getData(): Observable<Cat[]> {
    return this.httpClient.get<Cat[]>('http://something.com')
      .pipe(catchError(err) => this.handleError(err));
  }

  private handleError(err: HttpErrorResponse): Observable<Cat[]> {
    // do something
    const result: Cat[] = [];
    return of(result);
  }
}

并连接到它:

@Component({...})
export class SomeComponent implements OnDestroy {
  constructor(private readonly service: SomeService) {}

  public doSomething(): void {
    this.service.getData()
      .subscribe((x: Cat[]) => {
        alert(`Received ${x.length} cats`);
      });
  }
}

在某种程度上,Angular HttpClient变得更加智能,可以处理返回类型的映射,因此您可以创建自己的通用HttpService,并使用this.HttpClient.get

谢选
2023-03-14

首先,如果要将数据返回从一个可观察对象映射到其他对象,请将map()操作符传递到可观察对象的管道。这样地:

getSamples(): Observable<Cat[]>{
  return this.http.get(this.url).pipe(map(response => { .... });
}

但是如果get请求只是返回Cat[]数据,那么您不必映射它:

getSamples(): Observable<Cat[]>{
  return this.http.get(this.url);
}

其次,如果要激活从getSamples()返回的可观察对象,subscribe()将其激活,而不是subscriber()将其激活。

知道subscribe()函数将返回您所包含的可观察对象的订阅,而不是它包含的数据,这一点非常重要

从函数内部的可观察对象返回数据不是一个好方法,因为get()是一个异步函数,它需要等待http请求首先完成,才能返回正确的数据/错误。因此,更好的方法是激活外部某处的可观察对象,并将需要cat[]数据的逻辑传递给它:

ngOnInit() {
   this.service.getsamples().subscribe(response => {
       console.log(response) 
      // Do stuffs with respone data
   },err =>{
      console.log(err)
      // Do things with error
   });
}
 类似资料:
  • 问题内容: 这就是我想要做的。 如果在内部调用,您可能建议将其分配给变量like 并使用i like 。但是我出于个人目的需要使用like 。请提出建议? 问题答案: 您只是不能直接返回该值,因为它是一个异步调用。异步调用意味着它在后台运行(实际上已计划在以后执行),同时代码继续执行。 您也不能直接在类中有这样的代码。需要将其移至方法或构造函数中。 您可以做的不是直接使用而是使用像 此外,您可以将

  • 刚开始玩推送通知,我设法处理了所有的订阅过程,我正在数据库中保存endpoint和密钥。我的问题是,如果有的话,我应该遵循什么策略来删除数据库中的旧字幕详细信息?。所以,如果有人允许通知,他们撤销了权限,我怎么知道是谁从数据库中删除了详细信息?。因为如果用户取消订阅,我只会从pushManager获得空订阅。

  • 我对一个发布者-多个订阅者模式的实现有疑问。发布者使用固定大小的缓冲区并将消息排队。消息被发送给所有订户。订阅者获取消息的顺序必须与发布消息的顺序相同。 我使用阻止队列来保存发布者消息(发布者队列)并将其传递给每个订阅者阻止队列(订阅者队列)。 问题是缓冲区和订阅服务器工作正常,但缓冲区大小 (发布者Queue.size()) 始终返回 1。 这是我的完整代码: PublisherSubscrib

  • 我基本上需要从python服务器向设备发送命令,设备将发布对主题的回复,我需要捕获回复服务器端。要从服务器发布到设备,我正在使用boto3物联网数据模块。但是我如何订阅另一个主题以从设备获得回复?似乎没有办法使用aws python库。我需要使用像paho这样的遗传MQTT客户机吗? 谢谢你。

  • 第一,我试过了 第二,我尝试了下面的。(使用onErrorResumeNext),但取消了订阅。 (未调用onError,但调用OnComplete。因此已取消订阅) 第三,我试了下面。(带重试) 这比第一好。但没有刻录。 我想使刷新按钮,工作后错误。 我想知道 null 对不起,我的英语太差了。

  • 我正在尝试使用spring-integration-kafka-2.1.0。在我公司的项目中发布。但是,由于下面列出的例外情况,它不起作用:org。springframework。信息。MessageDeliveryException:Dispatcher没有频道“org”的订户。springframework。网状物上下文WebApplicationContext:/order。“奥Kafka”