【发布时间】:2017-03-21 17:19:28
【问题描述】:
如何将Observable.bindCallback() 与返回2 个参数callback(results, status) 的回调一起使用?该示例使用下面的google.maps.places API:
const service = new google.maps.places.PlacesService(map);
// service.nearbySearch(request, callback);
function callback(results, status) {
if (status === google.maps.places.PlacesServiceStatus.OK) {
for (var i = 0; i < results.length; i++) {
createMarker(results[i]);
}
}
}
我想做这样的事情:
const handleError = err=>console.error(error);
const nearbyAsObservable = Observable.bindCallback(service.nearbySearch)
nearbyAsObservable(request)
.subscribe(
(results,status)=>{
if (status!="OK") handleError(results);
callback
}
, handleError
)
但我不确定以下几点:
1) 是从next 处理程序中“抛出”错误并在error 处理程序中捕获它的最佳做法,或者只是调用方法handleError()?
2) 我收到Cannot read property 'nearbySearch' of undefined(…) 错误。但是当我打电话给const nearbyAsObservable = Observable.bindCallback( service.nearbySearch.bind(service) ) 时,我得到一个 TS 错误:
// const nearbyAsObservable = Observable.bindCallback(service.nearbySearch.bind(service) )
// nearbyAsObservable(request)
[ts] Supplied parameters do not match any signature of call target.
const nearbyAsObservable: () => Observable<{}>
更新看起来这个 hack 将修复 TS 错误
const nearbyAsObservable : any = Observable.bindCallback(service.nearbySearch.bind(service) )
nearbyAsObservable(request)
.subscribe(
(results,status)=>{
if (status!="OK") handleError(results);
callback
}
, handleError
)
但是如果我给它(result, status)=>void,next 处理程序会抱怨
3) 如何将 Observable 返回从 Observable<[result, status]> 转换为 Observable<PlaceResult[]>?
【问题讨论】:
-
试试
Observable.bindCallback(service.nearbySearch.bind(service)) -
你怎么知道你没有正确处理错误?
-
我使用
bindCallback和您使用的相同 API 回答了另一个问题,但我再也找不到它了。我只能假设用户的帐户已被删除。记住细节需要一点时间。 -
我想我找到了答案:在 bindCallback() 中使用选择器函数!我将在下面发布完整的答案。
-
是的,就是这样。您需要使用选择器将回调中接收到的参数映射到数组或对象,这将成为绑定函数返回的可观察对象的类型。
标签: angular typescript rxjs rxjs5