Angular 如何构建一个返回可观察数据的服务?
我正在构建一个服务,它可以查询GoogleMaps放置的自动完成API并返回一个对象数组。服务本身非常简单。我正在使用MapsJSAPI。一个字符串被传递给服务,它返回匹配列表 问题是如何将此服务输出转换为角度可观测 这就是我现在的处境:Angular 如何构建一个返回可观察数据的服务?,angular,Angular,我正在构建一个服务,它可以查询GoogleMaps放置的自动完成API并返回一个对象数组。服务本身非常简单。我正在使用MapsJSAPI。一个字符串被传递给服务,它返回匹配列表 问题是如何将此服务输出转换为角度可观测 这就是我现在的处境: import {Injectable, OnInit} from '@angular/core'; import {Observable} from 'rxjs/Rx'; declare var google: any; @Injectable() expo
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显然它被称为,编辑…这完全不起作用。我得到的只是一大堆神秘的错误信息。“提供的参数与调用目标的签名不匹配。”无论我将什么指定为参数,此参数始终存在。