无法导出生成器函数

IT技术 javascript reactjs redux generator redux-saga
2021-05-17 07:17:13

当尝试导出生成器函数以便在 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个回答

谁能告诉我为什么上面的代码无效?

这是regenerator-transform babel plugin 的一个众所周知的问题,它通常用于使用 sagas 转译代码。这个问题也会影响async功能,因为它们也是通过regenerator-transform机制实现的

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

经过改造的代码,可以有两个问题。首先是省略包含regenerator-runtime依赖性,这是强制性的。其次是函数提升,所以如果出现顺序很重要,应该隐式指定。

正确的解决办法是:

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