2017-08-20 29 views
0

私はredux-thunkからredux-sagaに移っていますが、1つの不足が見つかりました。アクションは、私が上で待つことができる約束を、返します約束のアクションの応答を得る(redux-thunkのような)

try { 
    downloadId = await dispatch(requestDownload('SOME_URL')); 
} catch(ex) { 
    console.log('download already existed, so request denied'); 
} 

:私は「要求を追加」することの非常に一般的な方法を持っていたReduxの-サンクで

requestファンクション(上記のrequestDownload)は、リクエストを許可してdownloadIdで解決するか、またはSOME_URLのダウンロードが既に存在する場合は拒否します。

私はこれをredux-sagaでどうやって行うことができますか?行動は何も返せないと思われる。

おかげredux-saga

答えて

1

あなたの代わりにeffectsと組み合わせてawaitが、yieldを使用していません。

あなたのコードは次のようになります。

// saga.js 

import { call, put } from 'redux-saga/effects' 
import { requestDownloadSucceeded, requestDownloadFailed } from './reducer.js' 

function* downloadRequestedFlow() { 
    try { 
    const downloadId = yield call(requestDownload, 'SOME_URL') 

    yield put(requestDownloadSucceeded(downloadId)) 
    } catch(error) { 
    yield put(requestDownloadFailed(error)) 
    } 
} 


// reducer.js 
... 
export const requestDownloadSucceeded = downloadId => ({ 
    type: REQUEST_DOWNLOAD_SUCCEEDED, 
    downloadId, 
}) 

export const requestDownloadFailed = error => ({ 
    type: REQUEST_DOWNLOAD_FAILED, 
    error, 
}) 

は、歩留まりの使用を可能に*と発電機能を注意してください。私も共通のREQUESTEDSUCCEEDEDFAILEDパターンを使用しています。

この回答が役に立ちましたと思います。

+0

ありがとう@Alex - 最初の 'ディスパッチ(アクション)'が成功したかどうかを知る必要があります。 redux-thunkでは、 'isFetching' /' isDownloading'が真であれば私のアクションは失敗し、私のアクションは 'state'をチェックします。 – Noitidart

+1

あなたの 'requestDownload'メソッドは約束を返します。これはサービス要求を行い、 'downloadId'で解決し、' catch'ブロックで捕捉された 'error'を使って拒否します。 – Alex

+0

これを完全に忘れてしまった。これは本当に私がサガを理解するのを助けました。 – Noitidart

関連する問題