Я работал над этим часами, но не могу найти решение:
Для длительной задачи я использую простое диалоговое окно vuetify v, включающее v-progress-linear бар, чтобы дать визуальную обратную связь с пользователем. Поскольку длительность задачи неизвестна, я использую индикатор выполнения как неопределенный как таковой:
<v-dialog
v-model="dialog"
persistent
min-width="350"
max-width="600"
hide-overlay
>
<v-card>
<v-card-title class="headline grey lighten-2">
{{ title }}
</v-card-title>
<v-card-text>
<p></p>
<h3>{{ message }}</h3>
</v-card-text>
<v-spacer></v-spacer>
<v-card-actions>
<v-spacer></v-spacer>
<v-progress-linear
indeterminate
color="blue"
class="mb-0"
width="100%"
/>
</v-card-actions>
</v-card>
<v-card> </v-card>
</v-dialog>
Я открываю это диалоговое окно перед длительным процессом, который сам упакован в обещание, и закрываю ( скрыть) это когда-то обещание решимости. Концептуально это выглядит следующим образом:
show_dialog();
long_running_task() // returns a promise
.then(close_dialog())
Проблема в том, что долго выполняющаяся задача (загрузка, анализ и манипулирование Excel на стороне клиента) занимает не только «долго» (около 10 секунд), но также требует ресурсов. И поскольку это в основном библиотечный вызов, для которого у меня нет исходного кода, у меня есть только один вызов atomi c.
Что теперь происходит, так это то, что индикатор выполнения в компоненте vuetify просто застревает и больше не обновляется, пока не завершится длительный процесс и не освободятся ресурсы. Мое предыдущее убеждение заключалось в том, что обещание может выполняться «по отдельности», и даже если много ресурсов используется, оно позволит выполнять другие задачи, а не просто обнимать все.
Я использую следующую среду:
- Процессор Intel Core i9-8959HK @ 2,90 ГГц
- 32 ГБ памяти
- Firefox
- Последний JS, Vue, стек Vuetify
Мой вопрос:
- Не верно ли мое понимание обещаний?
- Как я могу обеспечить правильное обновление индикатора выполнения, даже если в обещании используется много ресурсов? Или что-то еще происходит, что мне не хватает?