2017-04-17 39 views
1

我正在構建一項查詢Google地圖位置自動完成API並返回對象數組的服務。服務本身非常簡單。我正在使用Maps JS API。一個字符串被傳遞給服務,並返回匹配列表。如何構建一個返回Observable的服務?

問題是如何將此服務輸出轉換爲Angular Observable?

這就是我現在所在:

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 }); 
    } 
} 

但是,這不是一個觀察的,而我不能.subscribe它。

+0

什麼*是*它,然後呢?如果是承諾,請使用'Observable.fromPromise'。 – jonrsharpe

+0

您需要在地圖上繪製返回的數據嗎? – Aravind

+0

不,沒有地圖,現在只是一個自動完成的輸入。 –

回答

3

該文檔說autocomplete.getPlacePredictions有兩個參數:request和callback函數。所以你可以這樣做:

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); 
}); 
+0

這是正確的解決方案。謝謝! –

0

看着the example in the docsgetQueryPredictions

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

,預計最後一個參數是接收結果的回調。 getPlacePredictions大概是一樣的。這表明,你可以使用Observable.bindCallback如下:

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

注意bindCallback收益函數可以接受相同的參數被包裝的函數,減去回調。

+0

Observable.fromCallback()在Angular中似乎不存在。 –

+0

@TamásPolgár您正在使用哪個版本的RxJS(請參閱'package.json')?你從哪裏得到什麼錯誤? – jonrsharpe

+0

rxjs 5.0.1,rx 4.0.1。 Angular說:「來自Callback的屬性」在類型'typeof Observable'上不存在。)「 –

相關問題