feat: 前端改为轮询模式

This commit is contained in:
zerosaturation 2026-04-08 00:07:08 +08:00
parent e834029f6a
commit 965c37f2ff

View File

@ -91,59 +91,107 @@ const revertProgress = () => {
}, 100);
};
// API
// job_id
let jobId = null;
// API -
const callImageGeneration = async () => {
try {
const res = await imageGenerationApi(generationData);
try {
const res = await imageGenerationApi(generationData);
if (res.data && res.data.base_resp && res.data.base_resp.status_code === 0) {
console.log('[GenerationLoading] 图生图成功:', res);
if (res.data && res.data.job_id) {
jobId = res.data.job_id;
console.log('[GenerationLoading] 任务已创建:', jobId);
//
pollJobStatus();
} else {
uni.showToast({
title: '创建任务失败',
icon: 'none',
duration: 2000
});
revertProgress();
}
} catch (err) {
console.error('[GenerationLoading] 创建任务失败:', err);
uni.showToast({
title: '创建任务失败',
icon: 'none',
duration: 2000
});
revertProgress();
}
};
//
const imageUrls = res.data.data?.image_urls || [];
//
const pollJobStatus = () => {
let pollCount = 0;
const maxPolls = 40; // 120 / 3 = 40
if (imageUrls.length > 0) {
// base64
const processedImages = imageUrls.map(base64Data => {
// data URL
if (base64Data.startsWith('data:image')) {
return base64Data;
}
// data URL
return `data:image/png;base64,${base64Data}`;
});
const poll = async () => {
if (!jobId) return;
//
uni.setStorageSync('generated_images', JSON.stringify(processedImages));
try {
const res = await uni.request({
url: 'http://192.168.110.60:8080' + `/api/v1/assets/mints/image/generation/${jobId}`,
method: 'GET',
header: {
'Authorization': `Bearer ${uni.getStorageSync('access_token')}`
}
});
//
completeProgress();
} else {
uni.showToast({
title: '未生成图片',
icon: 'none',
duration: 2000
});
revertProgress();
}
} else {
// 退
uni.showToast({
title: res.data?.base_resp?.status_msg || '生成失败',
icon: 'none',
duration: 2000
});
revertProgress();
}
} catch (err) {
console.error('[GenerationLoading] 图生图失败:', err);
uni.showToast({
title: '生成失败',
icon: 'none',
duration: 2000
});
revertProgress();
}
const data = res.data?.data;
if (data) {
//
if (data.progress) {
progress.value = Math.min(data.progress, 90);
}
if (data.status === 'COMPLETED') {
//
const imageUrls = data.images || [];
if (imageUrls.length > 0) {
uni.setStorageSync('generated_images', JSON.stringify(imageUrls));
completeProgress();
} else {
uni.showToast({ title: '未生成图片', icon: 'none' });
revertProgress();
}
return;
} else if (data.status === 'FAILED') {
//
uni.showToast({
title: data.error_msg || '生成失败',
icon: 'none',
duration: 2000
});
revertProgress();
return;
}
}
pollCount++;
if (pollCount >= maxPolls) {
uni.showToast({ title: '生成超时,请重试', icon: 'none' });
revertProgress();
return;
}
// 3
setTimeout(poll, 3000);
} catch (err) {
console.error('[GenerationLoading] 轮询失败:', err);
pollCount++;
if (pollCount >= maxPolls) {
uni.showToast({ title: '查询失败,请重试', icon: 'none' });
revertProgress();
} else {
setTimeout(poll, 3000);
}
}
};
poll();
};
//