【发布时间】:2022-02-18 08:25:30
【问题描述】:
我遇到了这个vue-concurrency,它看起来像是一个处理异步调用的好库。
但我无法理解如何实现它。
这是一个使用 vue-concurrency 的简单 Vue 组件:
<template>
<div>
<div v-if="task.isRunning">Loading...</div>
<div v-else-if="task.isError">{{ task.last?.error.message }}</div>
<div v-else>
{{ task.last?.value }}
</div>
</div>
</template>
<script setup lang="ts">
import { timeout, useTask } from 'vue-concurrency';
const task = useTask(function* () {
yield timeout(1000);
if (Math.random() < 0.5) {
// lets say the API is flaky and errors out often:
throw new Error('Ruh oh. Something went wrong.');
} else {
return 'tada';
}
});
const instance = task.perform();
// Now I try to access some of the varibles
console.log(instance.isError); // runs immediatley, always returns "false"
console.log(instance.error); // runs immediatley, always returns "null"
console.log(instance.value); // runs immediatley, always returns "null"
console.log(task.isError); // runs immediatley, always returns "false"
console.log(task.last?.isError); // runs immediatley, always returns "false"
console.log(task.last?.error); // runs immediatley, always returns "null"
console.log(task.last?.value); // runs immediatley, always returns "null"
</script>
此组件进行虚假的 API 调用。停顿一秒钟。然后将抛出错误或返回“tada”字符串。
当前代码在模板中运行,它显示“正在加载...”,然后显示“tada”或错误消息。
但我想访问脚本标签内的任务和实例变量,目前它们都立即运行,无需等待异步调用执行。
我想我可以通过使用 await task.perform() 来解决这个问题。这样做会给我task.last?.value 变量。但是模板停止工作(变为空白)并且错误变量不会打印到控制台。
那么如何正确访问脚本标签内的 vue 并发任务/实例的状态值呢?
【问题讨论】:
-
您在物理上无法从异步调用中同步获取结果,这在stackoverflow.com/questions/14220321/… 和许多其他内容中进行了解释。 vue-concurrency 没有也不能解决这个问题。是的,它将通过
await task.perform()解决。这使得组件异步并且需要在父组件中使用vuejs.org/guide/built-ins/suspense.html