Redux Saga,为什么在从含有胖箭头功能的文件中测试一个传奇时会收到错误?

时间:2018-03-08 17:59:49

标签: redux redux-saga

我尝试从redux saga测试一个传奇时遇到了以下情况。

一些包裹信息:

我使用redux-saga@0.15.6redux@3.7.2node v9.5.0npm 5.6.0

我有以下结构:

sagas
    index.js
    index.spec.js

index.js内,我定义了我的传奇。我在那里的基本想法是:

function doSomething() {
  /* Some code */
}

function* notExportedSaga() {
  yield takeLatest(SOME_ACTION, doSomething)
}

export function* exportedSaga(action) {
  yield put({ type: OTHER_ACTION, payload: somePayload })
}

index.spec.js,我想测试我的传奇。我的文件顶部有一个import

import { exportedSaga } from './index'

使用我描述的结构和代码,这很好用。但是,如果我将doSomething从定义更改为胖箭头函数:

const doSomething = () => {
  /* Some code */
}

当运行单元测试时,会发生以下错误:

console.error node_modules/redux-saga/lib/internal/utils.js:240
  uncaught at rootSaga
   at rootSaga
   at rootSaga
   ReferenceError: doSomething is not defined

你知道为什么会这样吗?

我打开issue ,因为我不知道这是不是一个错误。

1 个答案:

答案 0 :(得分:3)

功能声明,如

function doSomething() { }

悬挂到顶部

函数表达式,如

const doSomething = () => { }

被悬挂

这就是您获得doSomething is not defined的原因 - notExportedSagaexportedSaga函数都被提升到顶部而表达式函数const doSomething = () => { }不是,并且未定义你的生成器函数调用。

如果你想了解更多内容,这里有一篇关于hoisting的精彩文章:) https://scotch.io/tutorials/understanding-hoisting-in-javascript