我们很难弄清楚如何使用转译的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}