2017-12-31 54 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 callparse에 전화를 포장하고 싶은 것을 내가 할 수있는 여기에 문서에 설명 된대로 더 나은 테스트 일 : 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 

} 

는 그래서이 무용담을 사용을 통해 어떻게 든 같이 나타납니다 :이 경우

스캐너는 아래 그림과 같이 (타이프 단위) parse 방법으로 호출되는 Parser 클래스 내부 속성입니다 패키지 및 this 참조를 엉망으로 만들었지?

어떻게 든 이전의 컨텍스트가 유지되는지 확인해야 할 것 같지만 외부 호출을 래핑하여 잃어버린 방법을 알지 못해서 이것을 달성하는 방법을 모르겠다. redux-sagacall 함수 .

편집 : 줄거리는

그래서 그것은 확실히 상황에 맞는 문제입니다 두꺼워 있지만 중첩 된 함수 호출을 호출 관련 보인다. 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) 

루트 객체에서 공용 인터페이스를 공개하고 싶습니다 (어쨌든 내 할 일 목록에 있던대로). 그러나 예상되는 결과입니까? 또는 일부 기발한?

답변

1

parse 때문에

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

를 작동하지 않는 것은 coreware.parser뿐 아니라 coreware하는 방법입니다.이 경우

는 다음 작업을 왜 안되지 않습니다 사가의이 범위를 훔치는 것 같다 이유

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

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

나는 지금까지 그 깊이와 같은 TBH 나는 완전히이 순간에 이해가 안 바인딩으로 가지 않았다 너무 많은 변경을하기 전에 좀 더 알아보고 싶습니다. 두 번째 예제는 구문 적으로 나에게 더 멋지다. 그리고 나는'corewar' 패키지의 API를 제어하므로 그렇게 할 수있다. 원래 함수는 Typescript로 쓰여졌 고, 원래의 요점에 따라 모듈로 묶여 있어야합니다. 어떻게 redux-saga가 범위에서 미트를 얻었는지 확신 할 수 없습니다. – dougajmcdonald