Javascript Ant Design Pro登录问题。不理解代码

Javascript Ant Design Pro登录问题。不理解代码,javascript,ant-design-pro,es6-generator,Javascript,Ant Design Pro,Es6 Generator,我在Ant Design pro工作。但是我不能理解登录代码的模式。在这里他们使用 effects: { *login({ payload }, { call, put }) {} } 如果您想查看完整代码,请转到此链接 在这里您可以找到完整的代码。现在我不明白那个代码是什么意思 谢谢带星号的函数名表示一个。生成器是一个函数,其运行过程可以使用yield关键字暂停。是生成器与其调用者之间的双向通信。有了这些知识,我们来看看函数本身: *logi

我在Ant Design pro工作。但是我不能理解登录代码的模式。在这里他们使用

effects: {
           *login({ payload }, { call, put }) {}
         }
如果您想查看完整代码,请转到此链接

在这里您可以找到完整的代码。现在我不明白那个代码是什么意思


谢谢

带星号的函数名表示一个。生成器是一个
函数
,其运行过程可以使用
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 || '/'));
      }
},
函数
需要两个对象作为输入,并将它们简化为参数。您需要将第一个参数作为对象传递,如
{payload:'something'}
,此对象的
payload
属性将映射到
函数的参数中。类似地,您传递的第二个对象将需要一个调用和一个put属性,这是函数

首先,它执行调用,传递fakeAccountLogin和负载,并生成函数,即函数暂停并将调用结果发送到外部作用域。当使用生成器迭代器的
.next()
函数
恢复登录函数时,传递给它的任何内容都将分配给响应。在此之后,调用
put
,将
changeLoginStatus
作为
type
传递,将
response
作为
payload
传递,如果将结果传递给该
函数的调用方,则传递结果

调用此生成器的迭代器的
.next()
时,将根据“ok”检查response.status,如果存在匹配项,则调用
reloadAuthorized
urlParams
将初始化
params
。在此之后,
redirect
将使用
params初始化。redirect
如果这是真的,
redirecturlparms
将被初始化,并将发生一些进一步的URL操作。无论如何,如果存在重定向,则函数结束

如果
response.status
'ok'
,但没有重定向,则调用
put
,并在下一次
调用时从
函数中产生结果。next()
调用将结束
函数。如果
response.status
不是
'ok'
,则
函数的结束时间要早得多,即当外部If被评估为false时


您需要研究如何减少Javascript中的对象和数组,以及迭代器和生成器函数。你将有一个困难的时间,直到你为此分配时间,所以你越早这样做,越好。我推荐本书的第2章和第5章:

带星号的函数名表示A。生成器是一个
函数
,其运行过程可以使用
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 || '/'));
      }
},
函数
需要两个对象作为输入,并将它们简化为参数。您需要将第一个参数作为对象传递,如
{payload:'something'}
,此对象的
payload
属性将映射到
函数的参数中。类似地,您传递的第二个对象将需要一个调用和一个put属性,这是函数

首先,它执行调用,传递fakeAccountLogin和负载,并生成函数,即函数暂停并将调用结果发送到外部作用域。当使用生成器迭代器的
.next()
函数
恢复登录函数时,传递给它的任何内容都将分配给响应。在此之后,调用
put
,将
changeLoginStatus
作为
type
传递,将
response
作为
payload
传递,如果将结果传递给该
函数的调用方,则传递结果

调用此生成器的迭代器的
.next()
时,将根据“ok”检查response.status,如果存在匹配项,则调用
reloadAuthorized
urlParams
将初始化
params
。在此之后,
redirect
将使用
params初始化。redirect
如果这是真的,
redirecturlparms
将被初始化,并将发生一些进一步的URL操作。无论如何,如果存在重定向,则函数结束

如果
response.status
'ok'
,但没有重定向,则调用
put
,并在下一次
调用时从
函数中产生结果。next()
调用将结束
函数。如果
response.status
不是
'ok'
,则
函数的结束时间要早得多,即当外部If被评估为false时


您需要研究如何减少Javascript中的对象和数组,以及迭代器和生成器函数。你将有一个困难的时间,直到你为此分配时间,所以你越早这样做,越好。我推荐本书的第2章和第5章:

谢谢您的重播。我真的被困在这里面了。但为什么他们会这样编码。它可以通过调用不同的函数来实现。为什么使用产量。如果你能帮助我解决关于产量的困惑!!!调用.next()找不到任何登录函数。我理解call()函数,但不理解put()函数。@Arnob不客气。如果导入并调用它Login,那么可以通过var myIterator=Login.effects.Login(yourobject1,yourobject2)调用Login函数;注意,这个调用只是创建迭代器并将参数传递给函数,函数还不会开始执行。只有在调用myIterator.next时,才开始执行函数,直到第一个yiel