-1

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

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

在我们故意调用 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/组件/App.js

在此处输入图像描述

4

1 回答 1

0

谢谢@IAmDranged

以下是他的回答

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

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

于 2021-04-16T09:23:41.470 回答