'BindCallback observable never get next value, while manual bind works
using google.maps.places.PlacesService
and the getDetails query
the method signature is
(method) google.maps.places.PlacesService.getDetails(
request: google.maps.places.PlaceDetailsRequest,
callback: (
a: google.maps.places.PlaceResult,
b: google.maps.places.PlacesServiceStatus
) => void)
): void
I would expect the following to works
getDetails$(request: google.maps.places.PlaceDetailsRequest) {
const request$ = bindCallback(this.placeService.getDetails);
return request$(request);
}
this.getDetails$({ placeId: place.place_id })
.pipe(
tap((e) => {
console.log(e);
})
)
.subscribe(([info]) => console.log(info));
but it doesn't trigger the callback at all.
If I do it manually :
getDetails$(request: google.maps.places.PlaceDetailsRequest) {
return new Observable<google.maps.places.PlaceResult>((observer) => {
this.placeService.getDetails(request, (result, status) => {
if (status === google.maps.places.PlacesServiceStatus.OK) {
observer.next(result);
} else {
observer.error(status);
}
observer.complete();
});
});
}
this.getDetails$({ placeId: place.place_id })
.pipe(
tap((e) => {
console.log(e);
})
)
.subscribe(([info]) => console.log(info));
now my logs works.
What am I doing wrong with bindCallback
?
Solution 1:[1]
Here is en example that works for me
getPlaceDetails(placeId: string) {
let observable = bindCallback(
this.placeService.getDetails.bind(this.placeService),
(results, status) => {
if (status != google.maps.places.PlacesServiceStatus.OK) throw {status, results};
return results
}
)
return observable({placeId, fields: ['ALL']})
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Taras Halynskyi |