Проблема с входом в Ant Design Pro. Не понимаю код

Я работал про Ant Design. Но я не могу понять модель кода входа в систему. Здесь они используют

effects: {
           *login({ payload }, { call, put }) {}
         }

если вы хотите увидеть полный код, перейдите по этой ссылке js-файл модели входа в Ant Design Pro

Здесь вы найдете полный код. Теперь я не понимаю, что означает этот код.

Спасибо


person Arnob    schedule 06.02.2019    source источник


Ответы (1)


Имя функции со звездочкой означает генератор. Генератор - это 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 и полезную нагрузку, и возвращает функцию, то есть функция приостанавливается и отправляет результат вызова во внешнюю область. Когда функция входа в систему возобновляется с использованием .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

person Lajos Arpad    schedule 06.02.2019
comment
спасибо за ваш повтор. Я действительно застрял в этом. но почему они так кодируют. Это можно сделать, вызвав функцию по-разному. Зачем использовать yield. Если вы любезны, можете помочь мне решить мою путаницу по поводу урожайности !!! Я не нахожу никакой функции входа в систему, вызывая .next (). Я понимаю функцию call (), но не понимаю функцию put (). - person Arnob; 07.02.2019
comment
@Arnob пожалуйста. Если вы импортируете это и назовете его Login, вы можете вызвать функцию входа через var myIterator = Login.effects.login (yourobject1, yourobject2); Обратите внимание, что этот вызов просто создает итератор и передает параметры функции, функция еще не начнет выполнение. Только когда вы вызываете myIterator.next, вы запускаете выполнение функции до первого yield (или до конца функции, если yield не достигнут). И затем каждый раз, когда вы вызываете next для итератора, выполнение функции продолжается. - person Lajos Arpad; 07.02.2019
comment
Генераторы Javascript @Arnob очень похожи на конечные автоматы. Причина, по которой функция входа в систему была запрограммирована таким образом, заключается в том, что функция в любом случае должна будет передать управление асинхронной функции, поэтому они намеревались сделать это доступным для чтения. Я знаю, я знаю, что это трудно читать, но сначала было трудно читать и традиционный код Javascript. Вам действительно нужно изучить особенности ES6, чтобы понять этот материал. Я знаю, что это требует много времени, но вы тратите меньше времени на его изучение, чем на изучение кода, написанного с его использованием. Я знаю это по собственному опыту. - person Lajos Arpad; 07.02.2019