函数设计需求
本函数解决需求如下
- 函数为封装好的异步函数
- 轮询未到终止状态时promise始终为padding状态
- 轮询未到终止态时需求每五秒请求一次接口
- 轮询接口为waitingCheckImportV2
- 状态值success为成功
- 状态值failed为成功
1. 简介
本心跳函数是一个异步函数,其作用是对传入的 id 进行连续访问,直到访问成功为止。在每次访问时,函数会等待五秒后再进行下一次访问。如果访问成功,则返回一个 resolved 状态的 Promise,其值为 id;否则返回一个 rejected 状态的 Promise。
在实际应用中,该函数通常被用于监控某个操作的完成情况,例如上传文件至服务器或导入数据到数据库。
2. 函数实现
函数主体代码如下:
async function continuousAccess(id) {
await new Promise((resolve) => setTimeout(() => resolve(), 5000))
const {
data, msg } = await waitingCheckImportV2({
threadName: id })
if (data === 'success') {
return Promise.resolve(id)
}
if (data === 'failed') {
ElMessage.error(msg || '计算失败')
return Promise.reject()
}
return continuousAccess(id)
}
其中,await new Promise((resolve) => setTimeout(() => resolve(), 5000))
表示等待五秒后再执行下一步操作。
接着,通过调用另一个异步函数 waitingCheckImportV2,获取指定 id 的状态信息(包括数据和信息)。如果数据为 ‘success’,即访问成功,则返回一个 resolved 状态的 Promise,其值为 id;如果数据为 ‘failed’,即访问失败,则调用 ElMessage.error 方法输出错误信息,并返回一个 rejected 状态的 Promise;否则继续进行下一次访问。
如果连续访问多次仍然没有成功访问,则函数会不断地递归调用自身,直到访问成功为止。
3. 注意事项
- 函数中必须传入参数 id,否则函数无法执行;
- 在使用该函数前,需要先定义异步函数 waitingCheckImportV2(轮询目的函数),并确保其能够获取指定 id 的状态信息;
- 调用函数后,应该对返回的 Promise 进行处理,以便在访问成功或失败时做出相应的操作。
4. 实际应用
在实际应用中,可以使用如下代码对心跳函数进行调用:
continuousAccess(someId)
.then(id => {
console.log(`访问 ${
id} 成功!`)
// 执行成功后的操作
})
.catch(() => {
console.log('访问失败!')
// 执行失败后的操作
})
其中,someId 是需要访问的目标 id。在访问成功时,将输出“访问 someId 成功!”;在访问失败时,将输出“访问失败!”。可以根据实际需求,在相应位置添加需要执行的操作。
5. 总结
本心跳函数是一个简单而实用的异步函数,主要用于监控某个操作的完成情况。其实现方式相对简单,适用性强,可以在很多场合得到应用。在使用该函数时,需要注意传参和 Promise 的处理,以便正确地执行代码。