Имя функции со звездочкой означает генератор .Генератор - это 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
.Аналогично, второй передаваемый объект будет нуждаться в вызове и атрибуте put, которые являются функциями.
Сначала он выполняет вызов, передавая fakeAccountLogin и payload, и возвращает функцию, то есть функция приостанавливает работу и отправляет результат.вызова во внешнюю сферу.Когда функция входа в систему возобновляется с использованием .next()
function
итератора генератора, все, что ему передано, будет присвоено ответу.После этого вызывается put
, передавая changeLoginStatus
как type
и response
как payload
и результат, если он будет передан вызывающей стороне этого function
.
Когда вызывается .next()
итератора этого генератора, response.status проверяется на 'ok', и если есть совпадение, то вызывается reloadAuthorized
, также инициализируется urlParams
как params
.После этого redirect
будет инициализирован с params.redirect
, и если это действительно так, redirectUrlParams
инициализируется, и произойдут некоторые дальнейшие операции с URL.В любом случае, если есть перенаправление, то функция завершается.
Если response.status
было 'ok'
, но перенаправления не было, то вызывается put
и результат получается из function
завершение при следующем вызове .next()
, function
завершится.Если response.status
не было 'ok'
, то function
закончился намного раньше, а именно, когда внешний if был оценен как ложный.
Вам нужно взглянуть на сокращение объектов и массивов в Javascriptа также итераторы и функции генератора.У вас будет трудное время, пока вы не выделите для этого время, поэтому чем раньше вы это сделаете, тем лучше.Я рекомендую Главу 2 и Главу 5 этой книги: https://github.com/getify/You-Dont-Know-JS/tree/master/es6%20%26%20beyond