【问题标题】:Generator Function Understanding in redux-saga workflow, yieldredux-saga 工作流程中的生成器函数理解,yield
【发布时间】:2021-04-16 07:40:11
【问题描述】:

我想我现在对生成器函数的概念感到困惑。

我记得生成器函数的工作方式是这样的

在我们故意调用 iterator.next() 之前,不会调用下一个 yield。

例如:

function* testing () {
     yield 1;
     yield 2;
     yield 3;
}

const iterator = testing();

我们只能通过iterator.next()得到1、2、3的值。

以上的理解就是我现在所拥有的。 (希望这是正确的理解)

但是,当我这样做时

function* getUsers() {
    try {
        const result = yield call(api.getUser);
        yield put(actions.getUsersSuccess({
            items: result.data.data
        }));
        console.log(result);

        yield 1;
        yield 2;
        yield 3;
        console.log("15");

    } catch(e) {

    }
}

当我启动应用程序时,它会分派 getUsersRequest,然后 Saga Watcher 接收此操作,然后调用工作人员 getUsers。 (希望这也是正确的理解)

代码在这里

class App extends Component {
    constructor(props) {
        super(props);
        **this.props.getUsersRequest();**
    }

    handleSubmit = ({firstName, lastName}) => {
        this.props.createUserRequest(firstName, lastName);
    };

    render() {
        const users = this.props.users;
        return (
            <div style={{margin: '0 auto', padding: '20px', maxWidth: '600px'}}>
                <NewUserForm onSubmit = {this.handleSubmit}/>
                <UserList users = {users.items}/>
            </div>
        );
    }
}


function* watchGetUsersRequest() {
    yield takeEvery(actions.Types.GET_USERS_REQUEST, getUsers);
}

我的问题是为什么在控制台中我们可以看到 console.log("15")?

我们从不故意调用 getUser.next()。

感谢您的热心回复和帮助!

可以看到 Saga 和 App 的实现 https://github.com/Oliverlee1003/SagaList/blob/main/src/sagas/users.js https://github.com/Oliverlee1003/SagaList/blob/main/src/components/App.js

enter image description here

【问题讨论】:

  • 欢迎来到 Stack Overflow!请拿起tour(你会得到一个徽章!),环顾四周,通读help center,尤其是How do I ask a good question?,我还推荐Jon Skeet的Writing the Perfect QuestionQuestion Checklist
  • "人民币"??是“记得”吗?请写完整的单词,使用正确的标点符号和大小写等,以便尝试阅读的人清楚您的问题。
  • "我们只能通过 iterator.next() 获得 2 和 3 的值。" 不,来自next 的第一个结果对象将有.value == 1 .下一个将有 2 个,下一个将有 3 个。请参阅 jsfiddle.net/tjcrowder/03c6ywna 为什么您希望跳过第一个?
  • 请编辑您的帖子以包含正在执行的代码getUsers()。我不知道您希望我们在其他方面为您提供帮助。
  • 谢谢 T.J.和马里奥的建议。我已经完善了帖子。 1. 记住人民币。 2. next 的第一个结果对象将具有 .value == 1。这是正确的,不应该跳过第一个。 3. App 类通过this.props.getUsersRequest(); 调度动作,然后Saga 观察者调用getUsers() by ``` function* watchGetUsersRequest()```

标签: javascript generator redux-saga


【解决方案1】:

感谢@IAmDranged

这是他的回答

redux-saga 框架将负责迭代您的 saga - 所以您不需要自己调用 next()。

在 redux-saga.js.org/docs/api/#middlewarerunsaga-args 中查看 middleware.run() 的注释

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    相关资源
    最近更新 更多