浏览代码

修复轮询

yuanmingze 2 周之前
父节点
当前提交
fe14335793
共有 1 个文件被更改,包括 27 次插入 和 8 次删除
  1. 27 8
      src/views/pedding-face-recognition/index.vue

+ 27 - 8
src/views/pedding-face-recognition/index.vue

@@ -77,11 +77,13 @@ const params = reactive<PushRecordIdRequest>({
 const lowCertLevelDialog = ref(false)
 const FACE_AUTH_POLL_INTERVAL = 1000
 const FACE_AUTH_POLL_TIMEOUT = 8000
+const FACE_AUTH_POLL_VERSION = 'face-auth-poll:20261015-v2'
 let pollTimer: ReturnType<typeof setTimeout> | undefined
 let timeoutTimer: ReturnType<typeof setTimeout> | undefined
 let redirectTimer: ReturnType<typeof setTimeout> | undefined
 let pollingStopped = false
-let pollingDeadline = 0
+let pollingDeadline: number | undefined
+let requestCount = 0
 let lastResponse: Awaited<ReturnType<typeof getFaceAuthResultApi>> | undefined
 
 const stopPolling = () => {
@@ -94,6 +96,10 @@ const stopPolling = () => {
 const handleFaceAuthResult = async () => {
   if (pollingStopped) return
   stopPolling()
+  console.info(FACE_AUTH_POLL_VERSION, 'finished', {
+    requestCount,
+    reason: lastResponse?.data?.rzzt === 'NO_REQUIRED_AUTHENTICATION' ? 'matched' : 'deadline',
+  })
 
   const res = lastResponse
   if (!res) {
@@ -119,26 +125,35 @@ const handleFaceAuthResult = async () => {
   }, 1800)
 }
 
-// 串行轮询,接口耗时也计入 8 秒上限。
+// 首次查询未命中目标状态后,再开始最多 8 秒的串行轮询。
 const getFaceAuthResult = async () => {
   if (pollingStopped) return
 
-  const remainingTime = pollingDeadline - Date.now()
-  if (remainingTime <= 0) {
+  const remainingTime = pollingDeadline === undefined ? undefined : pollingDeadline - Date.now()
+  if (remainingTime !== undefined && remainingTime <= 0) {
     await handleFaceAuthResult()
     return
   }
 
   try {
-    const res = await getFaceAuthResultApi(params, { timeout: remainingTime })
+    requestCount += 1
+    const res = await getFaceAuthResultApi(
+      params,
+      remainingTime === undefined ? {} : { timeout: remainingTime },
+    )
     // 超时或离开页面后,不再处理迟到的结果。
     if (pollingStopped) return
-    if (Date.now() >= pollingDeadline) {
+    if (pollingDeadline !== undefined && Date.now() >= pollingDeadline) {
       await handleFaceAuthResult()
       return
     }
 
     lastResponse = res
+    console.info(FACE_AUTH_POLL_VERSION, 'response', {
+      requestCount,
+      code: res.code,
+      rzzt: res.data?.rzzt,
+    })
     // 只在出现目标状态时提前结束轮询,其他结果等到 8 秒后统一处理。
     if (res.data?.rzzt === 'NO_REQUIRED_AUTHENTICATION') {
       await handleFaceAuthResult()
@@ -151,6 +166,11 @@ const getFaceAuthResult = async () => {
   }
 
   if (!pollingStopped) {
+    if (pollingDeadline === undefined) {
+      pollingDeadline = Date.now() + FACE_AUTH_POLL_TIMEOUT
+      timeoutTimer = setTimeout(handleFaceAuthResult, FACE_AUTH_POLL_TIMEOUT)
+    }
+
     pollTimer = setTimeout(
       getFaceAuthResult,
       Math.min(FACE_AUTH_POLL_INTERVAL, Math.max(0, pollingDeadline - Date.now())),
@@ -168,8 +188,7 @@ const handleSecurityLevelGuideClick = () => {
 }
 
 onMounted(() => {
-  pollingDeadline = Date.now() + FACE_AUTH_POLL_TIMEOUT
-  timeoutTimer = setTimeout(handleFaceAuthResult, FACE_AUTH_POLL_TIMEOUT)
+  console.info(FACE_AUTH_POLL_VERSION, 'start')
   getFaceAuthResult()
 })