【发布时间】: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
【问题讨论】:
-
欢迎来到 Stack Overflow!请拿起tour(你会得到一个徽章!),环顾四周,通读help center,尤其是How do I ask a good question?,我还推荐Jon Skeet的Writing the Perfect Question和Question 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