无法导出生成器功能

时间:2017-11-10 16:37:15

标签: javascript reactjs redux generator redux-saga

当尝试导出生成器函数以便在Redux-Saga中使用时,ES-Lint告诉我我的代码中有错误:

[eslint] Expected a function declaration. (func-style)

它的导出方式与目前的方式完全一致,目前该规则被忽略了:

/*eslint-disable func-style*/
const myExampleSaga = function* () {
        yield takeEvery('DO_SOMETHING_REQUEST', andDoThisFunc);
};
export default myExampleSaga;

我或多或少对ES-Lint不支持生成器(或者至少看起来那样)的事实没有好处,但是我想知道为什么下面的代码不起作用

export default function* () {
    yield takeEvery('DO_SOMETHING_REQUEST', andDoThisFunc);
}

出现以下错误消息:

undefined is not an object (evaluating 'regeneratorRuntime.mark')

我的rootSaga正在抛出错误消息,如下所示:

/*eslint-disable func-style*/
export const rootSaga = function* rootSaga() {
    yield all([
        spawn(myExampleSaga)
    ]);
};

有谁能告诉我为什么上面的代码无效?我认为它与吊装有关,但我无法找到任何理由为什么会无效。

1 个答案:

答案 0 :(得分:1)

  

有谁可以告诉我为什么上面的代码无效?

这是regenerator-transform babel plugin的众所周知的问题,它通常用于使用sagas转换代码。该问题也会影响async个函数,因为它们也是由regenerator-transform机制实现的。

export default function* () {
    yield takeEvery('DO_SOMETHING_REQUEST', andDoThisFunc);
}

transforming that code之后,可能会有两个问题。首先是省略包含regenerator-runtime依赖,这是必需的。第二是功能提升,因此如果发生顺序很重要,则应该隐式指定。

正确的解决方案是:

import 'regenerator-runtime';
const mySaga = function* () {
    yield takeEvery('DO_SOMETHING_REQUEST', andDoThisFunc);
}
export default mySaga;