javascript - Ant Design Pro 登录问题。看不懂代码
问题描述
我在 Ant Design pro 工作。但我无法理解登录代码的模型。他们在这里使用
effects: {
*login({ payload }, { call, put }) {}
}
如果您想查看完整代码,请转到此链接 Ant Design Pro 登录模型 js 文件
在这里你会找到完整的代码。现在我不明白那个代码是什么意思。
谢谢
解决方案
带星号的函数名表示生成器。生成器是function
可以使用yield
关键字暂停其运行进程的生成器。yield是生成器和调用者之间的双向通信。有了这些知识,让我们看看函数本身:
*login({ payload }, { call, put }) {
const response = yield call(fakeAccountLogin, payload);
yield put({
type: 'changeLoginStatus',
payload: response,
});
// Login successfully
if (response.status === 'ok') {
reloadAuthorized();
const urlParams = new URL(window.location.href);
const params = getPageQuery();
let { redirect } = params;
if (redirect) {
const redirectUrlParams = new URL(redirect);
if (redirectUrlParams.origin === urlParams.origin) {
redirect = redirect.substr(urlParams.origin.length);
if (redirect.match(/^\/.*#/)) {
redirect = redirect.substr(redirect.indexOf('#') + 1);
}
} else {
window.location.href = redirect;
return;
}
}
yield put(routerRedux.replace(redirect || '/'));
}
},
function
期望两个对象作为输入并将它们简化为参数。您需要将第一个参数作为对象传递,{payload: 'something'}
并且payload
该对象的属性将映射到function
. 同样,您传递的第二个对象将需要一个 call 和一个 put 属性,它们是函数。
首先它执行call,传递fakeAccountLogin和payload并生成函数,即函数暂停并将调用结果发送到外部作用域。当使用.next()
function
生成器的迭代器恢复登录功能时,传递给它的任何内容都将分配给响应。在这之后,put
被调用,传递changeLoginStatus
astype
和response
aspayload
和结果,如果让给 this 的调用者function
。
当.next()
这个生成器的迭代器被调用时,response.status 会被检查为 'ok',如果有匹配, thenreloadAuthorized
被调用,和 .urlParams
一样被初始化params
。在这redirect
将被初始化params.redirect
并且这是真的之后,redirectUrlParams
被初始化并且将发生一些进一步的 URL 操作。无论如何,如果有重定向,那么函数就会结束。
如果response.status
是'ok'
,但没有重定向,则调用 then 并在发出下一个调用时从末尾put
产生结果,则将结束。如果不是,则结束得更早,即当外部 if 被评估为假时。function
.next()
function
response.status
'ok'
function
您将需要研究减少 Javascript 中的对象和数组以及迭代器和生成器函数。在你为此分配时间之前,你会遇到困难,所以越早做越好。我推荐本书的第2章和第5章:https ://github.com/getify/You-Dont-Know-JS/tree/master/es6%20%26%20beyond
推荐阅读
- mongodb - MongoDB - 查询较低级别文档中的字段
- python - 如何使用python从复杂的JSON中提取值
- python - Heroku 应用程序无法连接到 Celery worker
- reactjs - 如何使用reactjs有条件地隐藏标题
- python - 当内部列表的数量未知时,如何将列表列表输入 *args?
- android - 我无法在我的 android 应用程序中加载地图平台,只显示徽标
- reactjs - 使用 ReactJS 在数组中推送一个项目
- c# - Roslyn 与 fastcoloredtextbox 集成以获取 c# 的语法错误
- java - 检查 Event(eventName(String), eventStartTime(LocalDate), eventEndTime(LocalDate)) 槽是否为空
- php - 更新 chrome 后,我在 selenium 中收到此错误