Home > @dinofe/xt-core > runWithDelayedLoading

# runWithDelayedLoading() function

带延迟加载提示的异步任务处理方法

Signature:

export declare function runWithDelayedLoading<T = any>(asyncTask: () => Promise<T>, { loadingDelay, minLoadingDuration, onLoading, onSettled, }?: IRunWithDelayedLoadingOptions): Promise<T>;

# Parameters

Parameter Type Description
asyncTask () => Promise<T> 任意异步任务函数,返回一个 Promise。
{ loadingDelay, minLoadingDuration, onLoading, onSettled, } IRunWithDelayedLoadingOptions (Optional)

Returns:

Promise<T>

返回一个 Promise,该 Promise 会在异步任务完成(无论成功或失败)并等待加载提示结束才 Settled。

# Remarks

  • 在设定的延迟时间内异步任务完成无加载提示;未完成时,触发加载提示;任务完成后,结束加载提示,且加载提示至少显示指定时长。

  • 返回的 Promise 与异步任务执行返回的 Promise 不同,但与其同时 Settled,自行对返回的 Promise 进行异常处理。

# Example 1

调用 API 请求

<script setup lang="ts">
import { runWithDelayedLoading } from '@dinofe/xt-core/common'
import { useLoading } from "vue-loading-overlay"
const gloading = useLoading()

function onSubmit(formData) {
 runWithDelayedLoading(async () => {
   return Api.save(formData)
 }, {
   onLoading: () => {
     // show loading
     gloading.show()
   },
   onSettled: () => {
     // close loading
     gloading.hide()
   },
   minLoadingDuration: 3000
 }).then(() => {
   // success 至少等 3s 才弹出提示
   window.alert("保存成功")
 }).catch((e) => {
   // error
   window.alert("保存失败")
 })
}
</script>

# Example 2

立即开始 loading,异步任务结束立即结束 loading、立即处理异步任务结果

<script setup lang="ts">
import { runWithDelayedLoading } from '@dinofe/xt-core/common'
import { useLoading } from "vue-loading-overlay"
const gloading = useLoading()

function onSubmit(formData) {
 runWithDelayedLoading(async () => {
   return Api.save(formData)
 }, {
   onLoading: () => {
     // show loading
     gloading.show()
   },
   onSettled: () => {
     // close loading
     gloading.hide()
   },
   loadingDelay: 0,
   minLoadingDuration: 0
 }).then((res) => {
   if (res.code === 0) {
     window.alert("保存成功")
   } else {
     window.alert("保存失败")
   }
 }).catch((e) => {
   // error
   window.alert("保存失败")
 })
}
</script>

# Example 3

在异步任务结束时立即预渲染页面,此时 loading 的关闭比异步任务结束要晚

<script setup lang="ts">
import { runWithDelayedLoading } from '@dinofe/xt-core/common'
import { useLoading } from "vue-loading-overlay"
const gloading = useLoading()
const result = ref()

function onLoadInfo(id) {
 runWithDelayedLoading(async () => {
   return Api.info(id).then((res) => {
     // success 接口返回成功后立即使用结果预渲染页面
     result.value = res
   }).catch((e) => {
     console.log(e)
   })
 }, {
   onLoading: () => {
     // show loading
     gloading.show()
   },
   onSettled: () => {
     // close loading 等异步逻辑完成时展示预渲染的页面
     gloading.hide()
     showDetail()
   },
 })
}

function showDetail() {
  // your code...
}
</script>