2017-01-17 8 views
3

最近私はredux-sagaを使い始めました。私は本当に気に入っています。reduxサンクからreduxサガへのAPIコールラッパーの移行方法

私は約束(私のAPIコール)を受け取り、プリローダーを表示してエラーを処理する私のAPIコールに使用していた以下のラッパーを持っています。

export const callApi = (promise: Promise<any>, errorMsg: string = 'Api error') => (dispatch: Dispatch) => { 
    dispatch(setLoading(true)); 
    return promise.then(
    (response) => { 
     dispatch(setLoading(false)); 
     return response.body; 
    }, 
    (error) => { 
     dispatch(setLoading(false)); 
     dispatch(apiError(errorMsg, error)); 
     return error; 
    }); 
}; 

私はredux sagaでこのような動作をどのように再現するのかは不明です。このようなことをする例は見つけられませんでしたか?


は、これまでのところ私は

const camelizeKeysPromise = (obj) => Promise.resolve(camelizeKeys(obj)); 


export function* sagaCallApi(promise: Promise<any>, errorMsg: string = 'Api error') { 
    yield put(setLoading(true)); 
    try { 
     const response = yield call(promise); 
     try { 
     const result = yield call(camelizeKeysPromise(response.body)); 
     return result; 
     } catch (e) { 
     return response.body; 
     } 
    } catch (exception) { 
     yield put(setLoading(false)); 
     yield put(apiError(errorMsg, error)); 
    }; 
} 

答えて

1

所望の応答を返さないことを約束するcall降伏を作ってみました。 eventChannelからredux-sagaまでを使用すると、成功した場合に応答を送信するチャネルを作成するか、失敗した場合にエラーオブジェクトを作成して、ご使用のサガのチャネルに登録することができます。

const promiseEmitter = promise => { 
    return eventChannel(emit => { 
    promise.then(
     response => emit({response}), 
     error => emit({error}) 
    ); 
    }); 
}; 

これで約束への呼び出しを置き換えることによって、あなたの新しい佐賀を変更します。

const channel = yield call(promiseEmitter, promise); 
const {response, error} = yield take(channel); 
if(response){ 
    // handle success 
    return response; 
}else if(error){ 
    // handle failure 
    yield put(setLoading(false)); 
    yield put(apiError(errorMsg, error)); 
} 

は、私は、エディタなしでこれを書いたが、することができますように私のコードで構文エラーがあるかもしれないことに注意してください一般的なアプローチを得る。

+0

あなたの答えに感謝します。私はちょうどチャンネルで読んでいます。私は、約束の代わりに、約束を返す関数を渡したなら、これが必要ではないと思うのは間違いないでしょうか? – Tom

+0

質問を誤解しない限り、その機能にコールエフェクトを与えると、あなたは約束を得て応答を返さないので、おそらく同じ問題に終わるでしょう。 –

関連する問題