2017-07-30 13 views
0

このコンセプトと設定には新しくなっていますので、私のvageの説明は事前に申し訳ありません!Redux Sagaクラスジェネレーター

私は別のモジュール用に再利用可能なサガを作成しようとしています。私が持っている問題は、thisは、クラス内のジェネレータ関数の概念の外にあるようですので、私はこの関数が静的に呼び出されていると思っていますか?

どのように私はこの種の構造を達成することができますか?基本的に私がしたいのは、url変数を操作できる関数を呼び出すことで、configというオブジェクトはextendごとに変更します。私はPHPのバックグラウンドから来たので、抽象クラスを拡張するという考えがあります。

import Saga from './Saga'; 
import {effects} from 'redux-saga'; 
import * as config from './config'; 

class SalonSagas extends Saga { 
    generatePaginationUrl(action) { 
     return 'salons/'; 
    } 
} 

export default function* saga() 
{ 

    const sagas = new SalonSagas(config); 

    effects.all([ 
     effects.fork(sagas.paginationAsync), 
    ]); 
} 

は、前の私は、この設定を使用する上記のクラスを使用して

export default class Saga { 
    config = {}; 
    constructor(config) { 
     this.config = config; 
    } 
    * paginationAsync() 
     while(true) { 
      const action = yield effects.take(this.config.PAGINATION_ASYNC); 
      const url = yield effects.call(this.generatePaginationUrl, action); 
      //this.config = "Cannot read property 'config' of null" 

      //Continue with stuff here 

     } 
    } 
} 

。私は、このメソッドを使用したいすべてのインスタンスに対して、この関数をコピーして貼り付けることを避けようとしています。

function* pagintationAsnyc() 
    while(true) { 
     const action = yield effects.take(config.PAGINATION_ASYNC); 
     const auth = yield effects.select((state) => state.auth); 

     //generic action 

     const response = yield effects.call(api.get, '/salons', {'Authorisation': 'Bearer '+auth.token}); 

     //do more generic actions I'm trying to prevent copying and pasting 

    } 
} 

答えて

0

ここで間違ったツールを使用しています。 。代わりにクラスの、あなたが頻繁に「ファクトリ関数」または「高階関数」として知られている機能(クイックたとえば返す関数を使用する必要があります。そのことについて

function createPaginationSaga(config) { 
    return function* paginationAsync() { 
     while(true) { 
      const action = yield effects.take(config.PAGINATION_ASYNC); 
      const url = yield effects.call(generatePaginationUrl, action); 
      //Continue with stuff here 

     } 
    } 
} 

を、私はあなたができると信じて実際のように、直接paginationAsync機能を再利用:。!function* paginationAsync(config)として、それを宣言する必要があろうと

export default function* saga() { 
    yield effects.all([ 
     effects.fork(paginationAsync, config), 
    ]); 
} 

、それがパラメータとして設定値を受け取るべき

+0

おかげで私は行くことを与えなければならない私がしようとしました! 'effects.fork(paginationAsync(config))'そしてそれは失敗しましただから私はそのアイデアをあきらめて、サガ機能で何かをすることができるかもしれないとは思っていましたが、確信が持てませんでした!再度、感謝します! – sourRaspberri