Vue 从承诺中返回

Posted

技术标签:

【中文标题】Vue 从承诺中返回【英文标题】:Vue returning from a promise 【发布时间】:2019-05-11 05:19:53 【问题描述】:

我正在尝试从这个调度中返回一些值

 this.$store.dispatch('setValue', this.Value)
      .then(response => 
        console.log(response)
);

在我的 vuex 操作中,我有

.catch(error => 
              if (error.response.status === 412) 
                return "some message"
     
);

如何将错误传递回进行 vuex 调度的 .vue 文件?

【问题讨论】:

在 vuex 动作中使用 throw 错误。 ).catch((error) => throw error) 【参考方案1】:

我认为正确的做法是在您的store 中有一个status 属性。

您的状态对象将由error, success, loading 组成。

所以如果你的动作抛出异常,你可以这样处理:

catch (error) 
    commit("error", `Some Message`);

您的错误突变如下所示:

error(state, payload) 
    state.status.success = false;
    state.status.loading = false;
    state.status.error = payload || false;

您的模板只会在 store.state.status 上收听

<div v-if="store.state.status.error">store.state.status.error</div>

我可能是错的,但在我个人看来,我认为使用操作来返回东西是错误的。您使用商店,所以不妨尽可能地利用它。

其他额外的好处是,如果 api 正在加载或某些事情成功,您可以向 .vue 文件指示。

【讨论】:

感谢 Jeremy 一个非常好的解决方案,我选择了其他看起来更容易的方法。 好的,太棒了,我在我的所有项目中都使用了这种模式,到目前为止效果很好。【参考方案2】:

我最终做的很简单。我将捕获物与我的调度联系起来:

this.$store.dispatch('setValue', this.Value)
      .then(response => 
        console.log(response)
)
.catch(error => 
              if (error.response.status === 412) 
                return "some message"
     
);

然后我从操作中返回了 Axios 调用:

return axios(
   method: 'post',
    url: `/mypath,
    data: mydata,
    json: true,
)

这意味着我可以在我想触发操作的地方处理返回的数据/错误。

【讨论】:

【参考方案3】:

商店:

.catch(error => 
  if (error.response.status === 412) 
      throw error
  
);

带有异步方法的Vue元素:

try
    let response = await this.$store.dispatch('setValue', this.Value)
 catch(error) 
    console.log(error)
);

【讨论】:

不错的解决方案,我可以看到这种情况会派上用场。

以上是关于Vue 从承诺中返回的主要内容,如果未能解决你的问题,请参考以下文章

Vue 计算属性返回一个承诺?

Vue.js:vuex 操作中未捕获的承诺

返回嵌套承诺但未找到响应

从承诺返回 then()

从异步函数返回的承诺中获取价值

承诺回调返回承诺