Vue.js 非阻塞 while 语句(轮询后端直到进度完成)

标签 vue.js async-await vuejs2 vuex

在 vue Action 中,我想轮询我的后端(调用另一个 async Action ,如下所述?)直到完成处理(前端显示加载程序直到进度结束)。

换句话说,我想重复进行 API 调用,如下所示:

actions: {
    load: async ({dispatch, commit, state}, {args}) => {
    await dispatch('progressPolling', {progressUrl, userId})
    // continue ONLY when progress has finished, else blocks at this statement
    ...
    }

    progressPolling: async ({dispatch, commit}, {progressUrl, userId}) => {
        var finished = false
        while(!finished) : {
            var progress = await dispatch('getResource', {url: progressUrl, userId: userId})
            finished = (progress.data.finished === true)
            // timeout of 2 secs
         }
    }
...
}

我的理解是,您可以使用 setTimeout() 语句在调用之间等待,但我不确定如何将其转换为非阻塞 while 语句,或者什么才是最好的练习实现这一目标。

编辑:“非阻塞”,因为我最初是在 while 循环中使用 wait() 语句。这使得 UI 每次不得不等待时都会卡住。

最佳答案

我会使用递归函数来做到这一点。

progressPolling: async ({dispatch, commit}, {progressUrl, userId}) => {
    // Define a recursive function
    async function getResource (resolve) {
        const progress = await dispatch('getResource', {url: progressUrl, userId: userId})
        // Recurse when not finished
        if (progress.data.finished !== true) {
            setTimeout( () => getResource(resolve), 2000);
        } 
    }
    // Kick the recursive function
    return new Promise (resolve => getResource(resolve))
    // Finished!
}

关于Vue.js 非阻塞 while 语句(轮询后端直到进度完成),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51819243/

相关文章:

javascript - 如何在单击按钮时使用不同的 v-model 在运行时生成嵌套文本框

javascript - Vuex 在调度 Action 时改变状态中的 2 个元素

python - 如何编写一个 Python 程序的异步/同步变体?

node.js - 异步/等待超时

javascript - vue中如何中止方法

javascript - Vue 模板或渲染函数尚未定义,但我两者都没有使用?

vue.js - Nuxt 动态 Assets 未加载

c# - 从 2.0 MongoDb c# 驱动程序获取结果

javascript - 如何正确选择所有复选框?

typescript - Vue/Typescript 如何找到用于样式的正确类型的对象 = { }