使用redux-saga yield调用调用外部函数似乎会产生上下文错误

时间:2017-12-31 12:09:51

标签: redux this redux-saga

我有一个redux-saga观察者/传奇设置,如下所示:

function* parseSaga(action) {

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

  yield put({ type: PARSE, result })

}

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

corewar是我编写的导入npm包。

当函数按上述方式编写时,它按预期工作,但我想将调用包含在parse yield call中,以便我可以更好地测试文档中描述的内容在这里: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

在这种情况下,扫描程序是Parser类的内部属性,在parse方法中调用,如下所示(在typescript中):

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

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

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

    ... other stuff

}

所以看起来好像通过使用这个传奇它已经进入我的npm包并弄乱了this引用?

似乎我需要以某种方式确保保留先前的上下文,但我不知道如何实现这一点,因为我不知道如何通过在{{1}中包装外部调用来丢失它} redux-saga功能。

编辑:情节变浓

所以它肯定是一个上下文问题,但它似乎与调用嵌套函数调用有关。我已经调整了call包,以便npm也从根对象公开,现在看到以下结果:

作品

parse

但原始的嵌套方法不是

不起作用

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

我愿意从根对象公开公共接口(因为它仍然在我的待办事项列表中),但这是预期的结果吗?还是有些怪癖?

1 个答案:

答案 0 :(得分:4)

这不起作用吗

version: '3'

services:
  db:
    image: postgres
  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

由于docker-compose build --force-em --no-cachelet result = yield call(corewar.parser.parse.bind(corewar.parser), action.redcode) 的方法,而不仅仅是parse

如果这不起作用那么为什么不:

coreware.parser