请解释一下:在检查 runSaga 时未捕获,saga 参数必须是生成器函数

Gab*_*MSC 8 javascript react-redux

我正在关注pluralsight 上的教程,这是一个全栈react/redux 教程,并且我正在使用以下代码创建一个saga.mock.js 文件。

这是我不熟悉的东西,希望得到解释,以便我能理解这一点。

import { take, put, select } from 'redux-saga/effects';
import * as mutations from './mutations';
import uuid from 'uuid';

export default function* taskCreationSaga(){
    while (true) {
            const {groupID} = yield take(mutations.REQUEST_TASK_CREATION);
            console.log("Got group ID", groupID);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在我商店的 index.js 中,我在星号**中添加了底部代码

import { createStore, applyMiddleware } from 'redux';
import { defaultState } from '../../server/defaultState';
import { createLogger } from 'redux-logger';
import createSagaMiddleware from 'redux-saga';

const sagaMiddleware = createSagaMiddleware();
import * as sagas from './sagas.mock'

export const store = createStore(
    function reducer(state = defaultState, action) {
        return state;
    },
    **applyMiddleware(createLogger(), sagaMiddleware)
);

for (let saga in sagas) {
    sagaMiddleware.run();
}**
Run Code Online (Sandbox Code Playgroud)

并收到以下错误,“在检查 runSaga(storeInterface, saga, ...args) 时未捕获:saga 参数必须是生成器函数!”

我通过改变这个解决了这个问题:

for (let saga in sagas) {
    sagaMiddleware.run();
}
Run Code Online (Sandbox Code Playgroud)

对此:

for (let saga in sagas) {
    sagaMiddleware.run(sagas[saga]);
}
Run Code Online (Sandbox Code Playgroud)

小智 6

该文档要求您为 run() 方法提供一个生成器函数,因此您只需传递默认生成器taskCreationSaga并从 sagas.mock.js 文件导入它即可

import { taskCreationSaga } from './sagas.mock';

for (let saga in sagas) {
   sagaMiddleware.run(taskCreationSaga)
}
Run Code Online (Sandbox Code Playgroud)

这应该适合您并允许您继续学习课程。


Tom*_*mer 2

run() 方法应该接收一个 sagas 数组(每个 saga 都是一个生成器函数),每个数组返回一个生成器对象。这样,中间件可以通过调用每个传奇的下一个传奇来处理异步过程,以遵循有序的操作序列,这也可能启动其他传奇。

我也在寻找对此的解释,并在redux-saga 文档中找到了它:(这是更详细地解释 run() 用法的部分)

在第一次迭代中,中间件调用 next() 方法来检索下一个 Effect。然后,中间件按照下面的效果 API 的指定执行生成的效果。同时,生成器将暂停,直到效果执行终止。收到执行结果后,中间件调用生成器上的 next(result),将检索到的结果作为参数传递给它。重复此过程,直到生成器正常终止或抛出一些错误。

如果执行导致错误(由每个 Effect 创建者指定),则调用 Generator 的 throw(error) 方法。如果 Generator 函数定义了围绕当前yield 指令的 try/catch,则底层 Generator 运行时将调用 catch 块。运行时还将调用任何相应的finally 块。

在这种情况下,Saga 被取消(手动或使用提供的 Effects),中间件将调用 Generator 的 return() 方法。这将导致生成器直接跳到finally块。