|
|
@@ -60,7 +60,7 @@ export interface AllStatusResponse {
|
|
|
* @param deviceId 设备ID
|
|
|
*/
|
|
|
export const queryDeviceStatus = (deviceId: string): Promise<DeviceStatusResponse> => {
|
|
|
- return post<DeviceStatusResponse>('/status/device', { deviceId });
|
|
|
+ return post<DeviceStatusResponse>('/status/device', { deviceId }, { silent: true });
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
@@ -68,7 +68,7 @@ export const queryDeviceStatus = (deviceId: string): Promise<DeviceStatusRespons
|
|
|
* @param activityId 活动ID
|
|
|
*/
|
|
|
export const queryRecognizeResult = (activityId: string): Promise<RecognizeResultResponse> => {
|
|
|
- return post<RecognizeResultResponse>('/status/recognize', { activityId });
|
|
|
+ return post<RecognizeResultResponse>('/status/recognize', { activityId }, { silent: true });
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
@@ -77,7 +77,7 @@ export const queryRecognizeResult = (activityId: string): Promise<RecognizeResul
|
|
|
* @param activityId 活动ID(与orderId二选一)
|
|
|
*/
|
|
|
export const queryOrderInfo = (orderId?: string, activityId?: string): Promise<OrderInfoResponse> => {
|
|
|
- return post<OrderInfoResponse>('/status/order', { orderId, activityId });
|
|
|
+ return post<OrderInfoResponse>('/status/order', { orderId, activityId }, { silent: true });
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
@@ -85,7 +85,7 @@ export const queryOrderInfo = (orderId?: string, activityId?: string): Promise<O
|
|
|
* @param deviceId 设备ID
|
|
|
*/
|
|
|
export const queryAllStatus = (deviceId: string): Promise<AllStatusResponse> => {
|
|
|
- return post<AllStatusResponse>('/status/all', { deviceId });
|
|
|
+ return post<AllStatusResponse>('/status/all', { deviceId }, { silent: true });
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
@@ -96,44 +96,78 @@ export const queryAllStatus = (deviceId: string): Promise<AllStatusResponse> =>
|
|
|
*/
|
|
|
export const pollDeviceStatus = (
|
|
|
deviceId: string,
|
|
|
- timeout: number = 120000,
|
|
|
- interval: number = 2000
|
|
|
+ timeout: number = 60000,
|
|
|
+ interval: number = 3000,
|
|
|
+ maxConsecutiveFailures: number = 3
|
|
|
): Promise<DeviceStatusResponse> => {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
const startTime = Date.now();
|
|
|
-
|
|
|
+ let timerId: ReturnType<typeof setTimeout> | null = null;
|
|
|
+ let settled = false;
|
|
|
+ let failCount = 0;
|
|
|
+
|
|
|
+ const cleanup = () => {
|
|
|
+ if (timerId !== null) {
|
|
|
+ clearTimeout(timerId);
|
|
|
+ timerId = null;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const done = (result: DeviceStatusResponse | null, err?: Error) => {
|
|
|
+ if (settled) return;
|
|
|
+ settled = true;
|
|
|
+ cleanup();
|
|
|
+ if (err) {
|
|
|
+ reject(err);
|
|
|
+ } else if (result) {
|
|
|
+ resolve(result);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
const poll = async () => {
|
|
|
+ if (settled) return;
|
|
|
+
|
|
|
try {
|
|
|
const response = await queryDeviceStatus(deviceId);
|
|
|
-
|
|
|
- // 检查是否有有效的状态更新
|
|
|
+
|
|
|
+ if (settled) return;
|
|
|
+
|
|
|
+ // 成功一次就重置失败计数
|
|
|
+ failCount = 0;
|
|
|
+
|
|
|
if (response && response.doorStatus && response.doorStatus !== 'unknown') {
|
|
|
const statusTime = parseInt(response.timestamp) || 0;
|
|
|
- // 如果状态更新时间在开始轮询之后,说明是新状态
|
|
|
if (statusTime > startTime - 10000) {
|
|
|
- resolve(response);
|
|
|
+ done(response);
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- // 检查是否超时
|
|
|
+
|
|
|
if (Date.now() - startTime >= timeout) {
|
|
|
- reject(new Error('轮询超时'));
|
|
|
+ done(null, new Error('轮询超时'));
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
- // 继续轮询
|
|
|
- setTimeout(poll, interval);
|
|
|
+
|
|
|
+ timerId = setTimeout(poll, interval);
|
|
|
} catch (error) {
|
|
|
- // 查询失败,继续轮询
|
|
|
+ if (settled) return;
|
|
|
+
|
|
|
+ failCount++;
|
|
|
+
|
|
|
+ if (failCount >= maxConsecutiveFailures) {
|
|
|
+ done(null, new Error('网络异常,轮询中断'));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
if (Date.now() - startTime >= timeout) {
|
|
|
- reject(new Error('轮询超时'));
|
|
|
+ done(null, new Error('轮询超时'));
|
|
|
return;
|
|
|
}
|
|
|
- setTimeout(poll, interval);
|
|
|
+
|
|
|
+ timerId = setTimeout(poll, interval);
|
|
|
}
|
|
|
};
|
|
|
-
|
|
|
+
|
|
|
poll();
|
|
|
});
|
|
|
};
|
|
|
@@ -146,40 +180,74 @@ export const pollDeviceStatus = (
|
|
|
*/
|
|
|
export const pollRecognizeResult = (
|
|
|
activityId: string,
|
|
|
- timeout: number = 60000,
|
|
|
- interval: number = 1000
|
|
|
+ timeout: number = 30000,
|
|
|
+ interval: number = 3000,
|
|
|
+ maxConsecutiveFailures: number = 3
|
|
|
): Promise<RecognizeResultResponse> => {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
const startTime = Date.now();
|
|
|
-
|
|
|
+ let timerId: ReturnType<typeof setTimeout> | null = null;
|
|
|
+ let settled = false;
|
|
|
+ let failCount = 0;
|
|
|
+
|
|
|
+ const cleanup = () => {
|
|
|
+ if (timerId !== null) {
|
|
|
+ clearTimeout(timerId);
|
|
|
+ timerId = null;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const done = (result: RecognizeResultResponse | null, err?: Error) => {
|
|
|
+ if (settled) return;
|
|
|
+ settled = true;
|
|
|
+ cleanup();
|
|
|
+ if (err) {
|
|
|
+ reject(err);
|
|
|
+ } else if (result) {
|
|
|
+ resolve(result);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
const poll = async () => {
|
|
|
+ if (settled) return;
|
|
|
+
|
|
|
try {
|
|
|
const result = await queryRecognizeResult(activityId);
|
|
|
-
|
|
|
- // 检查是否有识别结果
|
|
|
+
|
|
|
+ if (settled) return;
|
|
|
+
|
|
|
+ failCount = 0;
|
|
|
+
|
|
|
if (result && result.result) {
|
|
|
- resolve(result);
|
|
|
+ done(result);
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
- // 检查是否超时
|
|
|
+
|
|
|
if (Date.now() - startTime >= timeout) {
|
|
|
- reject(new Error('识别超时'));
|
|
|
+ done(null, new Error('识别超时'));
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
- // 继续轮询
|
|
|
- setTimeout(poll, interval);
|
|
|
+
|
|
|
+ timerId = setTimeout(poll, interval);
|
|
|
} catch (error) {
|
|
|
- // 查询失败,继续轮询
|
|
|
+ if (settled) return;
|
|
|
+
|
|
|
+ failCount++;
|
|
|
+
|
|
|
+ if (failCount >= maxConsecutiveFailures) {
|
|
|
+ done(null, new Error('网络异常,轮询中断'));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
if (Date.now() - startTime >= timeout) {
|
|
|
- reject(new Error('识别超时'));
|
|
|
+ done(null, new Error('识别超时'));
|
|
|
return;
|
|
|
}
|
|
|
- setTimeout(poll, interval);
|
|
|
+
|
|
|
+ timerId = setTimeout(poll, interval);
|
|
|
}
|
|
|
};
|
|
|
-
|
|
|
+
|
|
|
poll();
|
|
|
});
|
|
|
};
|
|
|
@@ -192,40 +260,74 @@ export const pollRecognizeResult = (
|
|
|
*/
|
|
|
export const pollOrderInfo = (
|
|
|
activityId: string,
|
|
|
- timeout: number = 60000,
|
|
|
- interval: number = 1000
|
|
|
+ timeout: number = 30000,
|
|
|
+ interval: number = 3000,
|
|
|
+ maxConsecutiveFailures: number = 3
|
|
|
): Promise<OrderInfoResponse> => {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
const startTime = Date.now();
|
|
|
-
|
|
|
+ let timerId: ReturnType<typeof setTimeout> | null = null;
|
|
|
+ let settled = false;
|
|
|
+ let failCount = 0;
|
|
|
+
|
|
|
+ const cleanup = () => {
|
|
|
+ if (timerId !== null) {
|
|
|
+ clearTimeout(timerId);
|
|
|
+ timerId = null;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const done = (result: OrderInfoResponse | null, err?: Error) => {
|
|
|
+ if (settled) return;
|
|
|
+ settled = true;
|
|
|
+ cleanup();
|
|
|
+ if (err) {
|
|
|
+ reject(err);
|
|
|
+ } else if (result) {
|
|
|
+ resolve(result);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
const poll = async () => {
|
|
|
+ if (settled) return;
|
|
|
+
|
|
|
try {
|
|
|
const order = await queryOrderInfo(undefined, activityId);
|
|
|
-
|
|
|
- // 检查是否有订单信息
|
|
|
+
|
|
|
+ if (settled) return;
|
|
|
+
|
|
|
+ failCount = 0;
|
|
|
+
|
|
|
if (order && order.orderId) {
|
|
|
- resolve(order);
|
|
|
+ done(order);
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
- // 检查是否超时
|
|
|
+
|
|
|
if (Date.now() - startTime >= timeout) {
|
|
|
- reject(new Error('获取订单超时'));
|
|
|
+ done(null, new Error('获取订单超时'));
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
- // 继续轮询
|
|
|
- setTimeout(poll, interval);
|
|
|
+
|
|
|
+ timerId = setTimeout(poll, interval);
|
|
|
} catch (error) {
|
|
|
- // 查询失败,继续轮询
|
|
|
+ if (settled) return;
|
|
|
+
|
|
|
+ failCount++;
|
|
|
+
|
|
|
+ if (failCount >= maxConsecutiveFailures) {
|
|
|
+ done(null, new Error('网络异常,轮询中断'));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
if (Date.now() - startTime >= timeout) {
|
|
|
- reject(new Error('获取订单超时'));
|
|
|
+ done(null, new Error('获取订单超时'));
|
|
|
return;
|
|
|
}
|
|
|
- setTimeout(poll, interval);
|
|
|
+
|
|
|
+ timerId = setTimeout(poll, interval);
|
|
|
}
|
|
|
};
|
|
|
-
|
|
|
+
|
|
|
poll();
|
|
|
});
|
|
|
};
|