(taskId, onUpdate, maxWaitMs = 20 * 60 * 1000)
| 141 | } |
| 142 | |
| 143 | async function watchPaymentOpTask(taskId, onUpdate, maxWaitMs = 20 * 60 * 1000) { |
| 144 | const startedAt = Date.now(); |
| 145 | while (Date.now() - startedAt < maxWaitMs) { |
| 146 | const task = await api.get(`/payment/ops/tasks/${taskId}`, { |
| 147 | timeoutMs: 30000, |
| 148 | retry: 0, |
| 149 | requestKey: `payment:op-task:${taskId}`, |
| 150 | cancelPrevious: true, |
| 151 | }); |
| 152 | |
| 153 | if (typeof onUpdate === "function") { |
| 154 | onUpdate(task); |
| 155 | } |
| 156 | |
| 157 | const status = String(task?.status || "").toLowerCase(); |
| 158 | if (["completed", "failed", "cancelled"].includes(status)) { |
| 159 | return task; |
| 160 | } |
| 161 | |
| 162 | await sleep(1200); |
| 163 | } |
| 164 | |
| 165 | throw new Error("支付任务等待超时,请稍后重试"); |
| 166 | } |
| 167 | |
| 168 | function escapeHtml(value) { |
| 169 | const div = document.createElement("div"); |
no test coverage detected