我们很难弄清楚如何使用转译的ES6代码处理上下文(或具体来说是{commit}在链式promise中的处理。)下面是一个Login动作的示例,该动作进行身份验证,然后使用RxJS作为流向用户使用subscribes在整个过程中,我们需要进行一些更改,但要不断获取commit is not a function错误。

是否有人知道或有类似的例子,或者有人可以提供有关在这种情况下在何处以及如何处理上下文/提交的任何基本准则-例如什么时候可以使用ES6,和/或何时不使用ES6,和/或在哪里悬挂上下文(如果没有),或者是否有更简单的方法来处理这些问题,例如将所有内容包装在主承诺中?由于我们需要在承诺链的每个步骤中潜在地进行承诺,因此我们无法看到其中的某些工作方式:

const actions = {
  login ({commit}, creds) { // need to commit here
    commit('toggleLoading')
    api.authenticate({
      strategy: 'local',
      ...creds
    })
    .then(function (result) {
      return api.passport.verifyJWT(result.accessToken)
    })
    .then(function ({commit}, payload) {  //need to commit here
      console.log(commit)
      return api.service('users').get(payload.userId)
      .subscribe(commit('setUser', user)) // need to commit here - but commit is not a function error
    })
    .catch(function ({commit}, error) {
      commit('setErr', `ERROR AUTHENTICATING: {$err.message}`) // need to commit here but commit is not a function error
      commit('toggleLoading')
    })
  }


我们发现的所有示例都非常简单,每个动作仅显示一次提交(或者如果if中包含2个)。任何帮助或反馈表示赞赏!

最佳答案

首先,.then.catch中的回调函数采用单个参数,您已经编码了两个...但是,commit参数中的login仍在范围内,因此很容易修复

您的代码可以简化如下

const actions = {
    login ({commit}, creds) {
        commit('toggleLoading');
        api.authenticate({strategy: 'local', ...creds})
        .then(result => api.passport.verifyJWT(result.accessToken))
        .then(payload => api.service('users').get(payload.userId).subscribe(commit('setUser', user)))
        .catch(function (error) {
            commit('setErr', `ERROR AUTHENTICATING: ${error.message}`);
            commit('toggleLoading');
        });
    }


注意:您在{$err.message}中有.catch,而我相信应该是${error.message}

09-17 22:57