Vue - 只有在第一个完成后才调用异步操作

Posted

技术标签:

【中文标题】Vue - 只有在第一个完成后才调用异步操作【英文标题】:Vue - call async action only after first one has finished 【发布时间】:2018-03-30 22:43:40 【问题描述】:

我需要从我的组件内部调用 2 个操作,但第二个操作应该在第一个操作 100% 完成它的工作后才开始。

我正在尝试,但它不起作用

mounted() 
    this.$store.dispatch('coinModule/loadApiCoins')
        .then(() => 
            this.$store.dispatch('coinModule/loadUserCoins')
        )
        .catch(error => 
            console.log(error)
        );
,

这两个动作是这些

    loadApiCoins( commit, dispatch, rootGetters ) 
        Vue.axios(
                method: 'get',
                url: 'https://api.coinmarketcap.com/v1/ticker/',
                transformRequest: [(data, headers) => 
                    delete headers.common.Authorization
                    return data
                ]
            )
            .then(response =>  commit('SET_API_COINS', response.data) )
            .catch(error =>  console.log(error) )
    ,

    loadUserCoins( commit, dispatch, rootGetters ) 
        Vue.axios.get('http://127.0.0.1:8000/api/coins/')
            .then(response => 
                commit('SET_USER_COINS', response.data)
                commit('SET_USER_PORTFOLIO_OVERVIEW')
            )
            .catch(error =>  console.log(error) )
    

这些应该是相反的。 Screen of my network tab

【问题讨论】:

【参考方案1】:

当您调度一个动作时,默认情况下它没有then 回调。只有当操作返回Promise 时才会出现这种情况。您的axios.get 调用应该返回Promise,但您并没有在您的操作中返回它。您应该简单地返回它,然后 then 回调将在您的 mounted 钩子中触发。

loadApiCoins( commit, dispatch, rootGetters ) 
  return Vue.axios(
    method: 'get',
    url: 'https://api.coinmarketcap.com/v1/ticker/',
    transformRequest: [(data, headers) => 
      delete headers.common.Authorization
      return data
    ]
  )
  .then(response =>  commit('SET_API_COINS', response.data) )
  .catch(error =>  console.log(error) )
,

【讨论】:

你的代码和我的一样。我如何用 axios 返回一个承诺?我认为“.then()”是承诺...? 我的错。我刚刚看到你在任何东西之前添加了“return”。就是这样了?我很困惑.. 对。假设您将dispatch 调用的返回值存储在mounted 钩子中,例如let promise = this.$store.dispatch('coinModule/loadApiCoins')。在您的代码中,loadApiCoins 操作不会返回任何内容,因此 promise 将是 undefined 并且 promise.then(() => ) 将导致错误。这就是this.$store.dispatch('coinModule/loadApiCoins').then(() => ) 不起作用的原因。调度调用的结果值为undefined。您需要从 Vue.axios 调用中显式返回结果 Promise 我还是一头雾水。如果我尝试记录组件的响应,它仍然是未定义的,所以我猜我并没有真正返回它,但代码现在按预期工作.. this.$store.dispatch('coins/loadApiCoins') .then(响应 => console.log(response) ) 我不确定您所说的“记录来自组件的响应”是什么意思。如果您像我展示的那样在dispatch 方法中返回axios 调用,那么console.log(this.$store.dispatch('coinModule/loadApiCoins')) 应该在控制台中记录一个Promise 对象。我认为您可能还会使用then 回调记录dispatch 调用。由于then 方法不返回任何内容,console.log(this.$store.dispatch('...').then(() => )) 将在控制台中记录undefined。这是意料之中的。

以上是关于Vue - 只有在第一个完成后才调用异步操作的主要内容,如果未能解决你的问题,请参考以下文章

vue前端异步与页面渲染问题:怎样让子异步函数完成后页面再渲染

同步方法与异步方法

node js异步IO机制

深入理解异步I/O+epoll+协程

仅在每个项目完成其方法调用后才返回

Java NIO(New IO)