2017-12-31 63 views
1

私は以下のようにredux-sagaウォッチャー/佐賀セットアップを持っているを与えるために表示されます。corewarは私が書いた輸入npmパッケージですは、コンテキスト・エラー

function* parseSaga(action) { 

    let result = corewar.parser.parse(action.redcode) 

    yield put({ type: PARSE, result }) 

} 

export function* parseWatcher() { 
    yield takeLatest(PARSE_REQUESTED, parseSaga); 
} 

関数は上記のように書かれている場合は、予想通り、それは動作しますが、私はここにドキュメントに記載されyield call私ができるように、より良いテストの事でparseへの呼び出しをラップしたいと思います:https://redux-saga.js.org/docs/basics/DispatchingActions.html

しかし、私はそうのような関数呼び出しをラップ:

let result = yield call(corewar.parser.parse, action.redcode) 

を私は次のように私のNPMパッケージから来るように表示されるエラーを取得:

uncaught at parseWatcher at parseWatcher 
at takeLatest 
at parseSaga 
TypeError: Cannot read property 'scanner' of null 
    at Parser.parse (http://localhost:3000/static/js/bundle.js:2017:28) 
    at runCallEffect (http://localhost:3000/static/js/bundle.js:43679:19) 
    at runEffect (http://localhost:3000/static/js/bundle.js:43601:648) 
    ... and so on 
それは私の npmの内側に持って

public parse(document: string, options?: IParseOptions): IParseResult { 

    options = Object.assign({}, Parser.DefaultOptions, options || {}); 

    var context = this.scanner.scan(document, options); 

    ... other stuff 

} 

だから、それはこのサガを使って何とかのように表示されます。この場合は

スキャナは、以下に示すように(typescriptです中)parseメソッドで呼び出されParserクラスの内部プロパティでありますパッケージとは、thisリファレンスを乱した?

以前のコンテキストが保持されていることをどうにかして確認する必要があるようですが、これを実現する方法がわかりませんでした。redux-sagacallファンクション。

EDIT:プロットは、だから、それは間違いなく、コンテキストの問題だが、それは、ネストされた関数呼び出しを呼び出すに関連すると思われる

を厚く。 parseもルートオブジェクトから露出し、現在、以下の結果を参照するように、私はnpmパッケージを微調整しました:

作品

let result = yield call(corewar.parse.bind(corewar), action.redcode) 
let result = yield call([corewar, corewar.parse], action.redcode) 

が、元のネストされた方法を

ありません動作しません。

let result = yield call(corewar.parser.parse.bind(corewar), action.redcode) 
let result = yield call([corewar, corewar.parser.parse], action.redcode) 

私はルートオブジェクトからパブリックインターフェイスを公開しようとしています(とにかく私のtodoリストにあったように)、これは期待された結果ですか?またはいくつかのクールーク? parsecoreware.parserだけでなくcorewareの方法であるので

答えて

1

は、この作業

let result = yield call(corewar.parser.parse.bind(corewar.parser), action.redcode) 

ではありません。

これは、働いていない理由ではない場合:

const parse = code => corewar.parser.parse(code); 

let result = yield call(parse, action.redcode) 
+0

私は限り佐賀のスコープを盗んでいるように見える理由は、私は完全にこの時点で理解していないTBHように、その深いをバインドするとは行きませんでしたあまりにも多くの変更を加える前にもう少し調べてみたいと思います。 2番目の例は、私にとっては構文的には良いようですが、私は 'corewar'パッケージのAPIを制御して、そのような機能をそのように公開することができます。オリジナルの関数はTypescriptで書かれているので、元のポイントごとにモジュールでまとめられているはずです。redux-sagaがどのようにスコープ上でミットしているのかわかりません – dougajmcdonald

関連する問題