2017-03-23 16 views
1

私はf(x, callback)Observable<Action>に変換するためにbindCallBackを使用しています。 f(x, callback)である場合:rxjs:bindCallbackはObservableの悪い署名を返します

f(
    data: StripeCardTokenData, 
    responseHandler: 
    (
     status: number, 
     response: StripeCardTokenResponse 
    ) => void 
): void; 

だから、fStripe.card.createTokenです。

StripeCardTokenResponseがある

:だから

export interface Action { 
    type: string; 
    payload?: any; 
} 

、私はactions$Observable<Action>を宣言した:

interface StripeTokenResponse { 
    id: string; 
    client_ip: string; 
    created: number; 
    livemode: boolean; 
    object: string; 
    type: string; 
    used: boolean; 
    error?: StripeError; 
} 

一方では、私はActionがあるObservable<Action>を使用しています

this.actions$ 
    .ofType('ADD_SOURCE') 
    .switchMap(
     (action: Action) => { 
     ((((1)))) 
    ); 

だから、((((1))))私はStripe.card.createToken(data, callback)に電話し、callback(status, response)response.errorに電話する必要があります。(Observable.of(<Action>{ type: 'ADD_SOURCE_SUCCESS' }))または(Observable.of(<Action>{ type: 'ADD_SOURCE_SUCCESS' }))を返す必要があります。

しかし、私はいくつかの問題を抱えています。

まず、私が観察可能なコールバックを作成する必要があります。

だから、
(local var) callback: (v1: StripeCardTokenData) => Observable<number> 

callbackObservable<number>です:

var callback = Observable.bindCallback(Stripe.card.createToken); 

それでも、typescriptですがcallbackがあることを私に語っています。それに対処するにはresponse: StripeCardTokenResponseはどこですか?

私はそれをとてもうまく説明したかどうかわかりません。私はそれで本当に苦労していますが、私はそれを解決する方法をかなり理解していません。

答えて

1

bindCallbackは扱いにくい場合があります。 TypeScriptがタイプを推測し、the numerous bindCallback signaturesのいずれかと一致しようとしています。

あなたcallback変数が(v1: StripeCardTokenData) => Observable<number>ある場合は、活字体は、このシグネチャを持つ関数に一致しているように見えます:

static create<T, R>(
    callbackFunc: (v1: T, callback: (result: R) => any) => any, 
    selector?: void, 
    scheduler?: IScheduler 
): (v1: T) => Observable<R>; 

コールバックが正しく配線されていますが、responseパラメータへのアクセスを取得するには、次のものが必要 - そう、彼らはanyとして入力されます

var callback = Observable.bindCallback(
    Stripe.card.createToken, 
    (status: number, response: StripeCardTokenResponse) => ({ status, response }) 
); 

は、私が(上記のように)、コールバックパラメータの型と明示されて推薦する:セレクタを指定します。

指定されたセレクタで、あなたのcallback変数は以下の型持っている必要があります。

(v1: StripeCardTokenData) => Observable<{ status: number; response: StripeCardTokenResponse; }> 

をそして、あなたはこのような何か、それを使用します。

this.actions$ 
    .ofType('ADD_SOURCE') 
    .switchMap(
    (action: Action) => { 
     var callback = Observable.bindCallback(
     Stripe.card.createToken, 
     (status: number, response: StripeCardTokenResponse) => ({ status, response }) 
    ); 
     return callback(action.payload/* or whatever */) 
     .map(({ status, response }) => { 
      var result: Action; 
      if (response.error) { 
      result = { type: "ADD_SOURCE_ERROR" }; 
      } else { 
      result = { type: "ADD_SOURCE_SUCCESS" }; 
      } 
      return result; 
     }); 
    } 
); 

私はストライプのAPIに精通していませんよしたがって、Stripe.card.createTokenStripe.cardにバインドする必要があるかどうかは不明です。その場合はFunction.prototype.bindを使用しないことをお勧めします。これはanyを返し、TypeScriptの推論タイプがbindCallbackにならないためです。代わりに矢印機能を使用できます:

var callback = Observable.bindCallback(
    (
    data: StripeCardTokenData, 
    responseHandler: (status: number, response: StripeCardTokenResponse) => void 
) => Stripe.card.createToken(data, responseHandler), 
    (status: number, response: StripeCardTokenResponse) => ({ status, response }) 
); 
関連する問題