角度解析器中的回调和可观察

时间:2018-12-21 09:47:30

标签: angular callback rxjs observable

我正在使用角度解析器为我的路线提供数据。对于其中之一,我需要获取给定地址字符串的经度和纬度。为此,我使用了Google地理编码api:

service.geocode({address: params.address}, results => {
  params.lat = results[0].geometry.location.lat();
  params.lon = results[0].geometry.location.lng();
});

因此在我的服务中,我需要等待回调触发后再调用apiService,因此主要思想是实现这一点:

search(params): Observable<Calendar[]> {    
    return service.geocode({address: params.address}, results => {
          params.lat = results[0].geometry.location.lat();
          params.lon = results[0].geometry.location.lng();
          return this.apiService.get('/api/v1/website/' + environment.web_id + '/calendar/_search', params)
          .pipe(map(
            data => {
              return data;
            }
          ));
    });
}

但是我需要返回一个Observable,所以这将无法工作。 有没有一种方法可以获取可观察到的地址解析回调,然后使用rxJs运算符将它们链接起来?

谢谢!

2 个答案:

答案 0 :(得分:1)

当然有办法。最简单的步骤是将整个事物包装成可观察的形式。天真的方法是这样做:

y = np.dstack((x,z,x)).swapaxes(0,2)
y.shape
# (3, 2, 2)

现在,我们可能会做得更好,并提取其中的一部分。

search(params): Observable<Calendar[]> {
  // First, an observable. We get the observer back.
  return Observable.create(observer => {
    // Now go call your service.geocode (whatever that might be)
    service.geocode({address: params.address}, results => {
      // extend your params with the extra information.
      params.lat = results[0].geometry.location.lat();
      params.lon = results[0].geometry.location.lng();

      // shot the http request
      this.apiService.get('/api/v1/website/' + environment.web_id + '/calendar/_search', params)
        .pipe(
          map(data) => {
            // When the data is back, resolve it.
            observer.next(data);
            observer.complete();
          }),
        );
    });
  });

您可以继续做下去,但这是最基本的。

答案 1 :(得分:-1)

您可以通过多种方式来实现这一目标(rxjs6)

import { of } from 'rxjs';

,然后根据该值创建可观察对象,如下所示:

of(someValue);

如果直接返回someValue,它将是正常数据,但是如果您使用rxjs中的operator,则可以将该数据转换为可观察的数据,并在需要时进行订阅,请相应地修改代码,希望对您有帮助