2016-11-08 7 views
3

Observable.bindCallback()を2 args、callback(results, status)を返すコールバックでどのように使用しますか?以下の例ではgoogle.maps.places APIである:どのようにObservable.bindCallback()を使用しますか

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(…)エラーが発生しています。しかし、私は、私はTSのエラーを取得するconst nearbyAsObservable = Observable.bindCallback(service.nearbySearch.bind(service))を呼び出すとき:アップデート

// const nearbyAsObservable = Observable.bindCallback(service.nearbySearch.bind(service)) 
// nearbyAsObservable(request) 
[ts] Supplied parameters do not match any signature of call target. 
const nearbyAsObservable:() => Observable<{}> 

このハックは、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[]>に変換するにはどうすればよいですか?

+0

てみ 'Observable.bindCallback(service.nearbySearch.bind(サービス))' – cartant

+1

はどのように知っていますか、あなたは正しくエラーを処理していませんか? – martin

+0

あなたが使用しているのと同じAPIで 'bindCallback'を使って別の質問に答えましたが、もう見つけられません。私はユーザーのアカウントが削除されたと仮定することしかできません。詳細を覚えておいてください。 – cartant

答えて

1

答えは以下の通りです:

1)(コメントを参照してください)

2)あなたはスコープをバインドする場合は、TSのバグを修正するためにlet nearbyAsObservable : any;を使用し、必要に応じて、あなたのコールバックにスコープをバインドhow do I use `Observable.bindCallback()` with typescript

3)Observable.bindCallback()selector関数を使用して、subscribe関数の複数の戻り引数を1つの応答にマップし、エラーをスローします。 How do I use the RXJS selector function in the Observable.bindCallback method?

let nearbyPlaces = function(position: google.maps.LatLng) : Observable<google.maps.places.PlaceResult[]> { 
    const service = new google.maps.places.PlacesService(map) 
    // 1) bind scope 
    const nearbySearchCallback = service.nearbySearch.bind(service) 

    let nearbyAsObservable : any; 
    // 2) type any fixes: 
    // [ts] Supplied parameters do not match any signature of call target. 
    // const nearbyAsObservable:() => Observable<{}> 

    nearbyAsObservable = Observable.bindCallback( 
    nearbySearchCallback  // with bound scope 
    , (results, status) => { // 3) selector function 
     if (status != google.maps.places.PlacesServiceStatus.OK) throw {status, results}; 
     return results 
     } 
); 
    const placeRequest = { 
    location: position, 
    radius: 25, 
    rankBy: google.maps.places.RankBy.PROMINENCE, 
    } 
    return nearbyAsObservable(placeRequest) as Observable<google.maps.places.PlaceResult[]> 
} 


// usage example: 
nearbyPlaces(position).subscribe(
    (results:google.maps.places.PlaceResult[])=>console.log(results) 
    , err=>console.error(err) 
) 
+0

'bind'の結果を'(リクエスト:PlaceSearchRequest、コールバック:(結果:PlaceResult []、ステータス:PlacesServiceStatus)=> void)=> void'にキャストすると、それはTypeScriptでうまくいくはずです。それは長くて醜いキャストです。 – cartant

関連する問題