Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 如何构建一个返回可观察数据的服务?_Angular - Fatal编程技术网

Angular 如何构建一个返回可观察数据的服务?

Angular 如何构建一个返回可观察数据的服务?,angular,Angular,我正在构建一个服务,它可以查询GoogleMaps放置的自动完成API并返回一个对象数组。服务本身非常简单。我正在使用MapsJSAPI。一个字符串被传递给服务,它返回匹配列表 问题是如何将此服务输出转换为角度可观测 这就是我现在的处境: import {Injectable, OnInit} from '@angular/core'; import {Observable} from 'rxjs/Rx'; declare var google: any; @Injectable() expo

我正在构建一个服务,它可以查询GoogleMaps放置的自动完成API并返回一个对象数组。服务本身非常简单。我正在使用MapsJSAPI。一个字符串被传递给服务,它返回匹配列表

问题是如何将此服务输出转换为角度可观测

这就是我现在的处境:

import {Injectable, OnInit} from '@angular/core';
import {Observable} from 'rxjs/Rx';
declare var google: any;

@Injectable()
export class GoogleMapsService {

    getAutocomplete(input = {'input': '', 'types': [] } ) {
        var autocomplete = new google.maps.places.AutocompleteService();
        return autocomplete.getPlacePredictions({ input: input.input });
    }
}
但是这不是一个可观察的,我不能
。订阅它。

查看
getQueryPredictions

var service = new google.maps.places.AutocompleteService();
service.getQueryPredictions({ input: 'pizza near Syd' }, displaySuggestions);
它期望最后一个参数是接收结果的回调
getPlacePredictions
大概是相同的。这表明您可以按如下方式使用:

return Observable.bindCallback(autocomplete.getPlacePredictions)({ input: input.input });
请注意,
bindCallback
返回的函数采用与包装函数相同的参数,减去回调。

查看
getQueryPredictions

var service = new google.maps.places.AutocompleteService();
service.getQueryPredictions({ input: 'pizza near Syd' }, displaySuggestions);
它期望最后一个参数是接收结果的回调
getPlacePredictions
大概是相同的。这表明您可以按如下方式使用:

return Observable.bindCallback(autocomplete.getPlacePredictions)({ input: input.input });

请注意,
bindCallback
返回一个函数,该函数采用与包装函数相同的参数,减去回调。

文档中说autocomplete.getPlacePredictions有两个参数:request和callback function。因此,您可以:

Observable.create(obs => {
  let displaySuggestions = function (predictions, status) {
    if (status != google.maps.places.PlacesServiceStatus.OK) {
      obs.error(status);
    }
    else {
      obs.next(predictions);
      obs.complete();
    }
  };

  var service = new google.maps.places.AutocompleteService();
  service.getQueryPredictions({input: 'test'}, displaySuggestions);
});

文档中说autocomplete.getPlacePredictions有两个参数:请求和回调函数。因此,您可以:

Observable.create(obs => {
  let displaySuggestions = function (predictions, status) {
    if (status != google.maps.places.PlacesServiceStatus.OK) {
      obs.error(status);
    }
    else {
      obs.next(predictions);
      obs.complete();
    }
  };

  var service = new google.maps.places.AutocompleteService();
  service.getQueryPredictions({input: 'test'}, displaySuggestions);
});

那是什么?如果它是一个承诺,请使用
Observable.fromPromise
。对于返回的数据,您需要将它们绘制在地图上?不,没有地图,现在它只是一个自动完成的输入。那么它是什么呢?如果它是一个承诺,请使用
Observable.fromPromise
。返回的数据需要绘制在地图上?不,没有地图,现在只是一个自动完成的输入。Observable.fromCallback()在Angular中似乎不存在。@TamásPolgár您使用的RxJS版本是什么(请参阅您的
包.json
)?你得到了什么错误,从哪里来的?rxjs 5.0.1,rx 4.0.1。Angular说:“属性'fromCallback'在类型'typeof Observable'上不存在。”@TamásPolgár显然它被称为,编辑…这完全不起作用。我得到的只是一大堆神秘的错误信息。“提供的参数与调用目标的签名不匹配。”无论我将什么指定为参数,此参数始终存在。在Angular中似乎不存在Observable.fromCallback()。@TamásPolgár您使用的是哪个版本的RxJS(请参阅您的
包.json
)?你得到了什么错误,从哪里来的?rxjs 5.0.1,rx 4.0.1。Angular说:“属性'fromCallback'在类型'typeof Observable'上不存在。”@TamásPolgár显然它被称为,编辑…这完全不起作用。我得到的只是一大堆神秘的错误信息。“提供的参数与调用目标的签名不匹配。”无论我将什么指定为参数,此参数始终存在。