试了下可以了,和你这个差不多,但多了个“等待assetdb”的步骤:
import { BuildHook, IBuildResult, ITaskOptions } from '../@types';
import { PACKAGE_NAME } from './global';
function log(...arg: any[]) {
return console.log(`[${PACKAGE_NAME}] `, ...arg);
}
function sleep(ms: number) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function queryAssetCount(): Promise<number> {
try {
const assets = await Editor.Message.request('asset-db', 'query-assets');
return Array.isArray(assets) ? assets.length : 0;
} catch (e) {
console.warn(`[${PACKAGE_NAME}] query-assets failed`, e);
return 0;
}
}
const STABLE_POLLS = 5;
const INTERVAL_MS = 3000;
const MAX_WAIT_MS = 180000;
const FINAL_DELAY_MS = 5000;
async function waitAssetDbStable(): Promise<boolean> {
let lastCount = -1;
let stable = 0;
const start = Date.now();
while (Date.now() - start < MAX_WAIT_MS) {
const count = await queryAssetCount();
log('AssetDB poll', { count, stable, STABLE_POLLS });
if (count > 0 && count === lastCount) {
stable++;
if (stable >= STABLE_POLLS) {
log('AssetDB stabilized');
return true;
}
} else {
stable = 0;
lastCount = count;
}
await sleep(INTERVAL_MS);
}
console.warn(`[${PACKAGE_NAME}] AssetDB did not stabilize within ${MAX_WAIT_MS}ms`);
return false;
}
export const onBeforeBuild: BuildHook.onBeforeBuild = async function(options: ITaskOptions, result: IBuildResult) {
const ok = await waitAssetDbStable();
if (!ok) {
await sleep(FINAL_DELAY_MS);
}
};
export const onError: BuildHook.onError = async function(options, result) {
console.warn(`${PACKAGE_NAME} run onError`);
try {
const count = await queryAssetCount();
console.warn(`[${PACKAGE_NAME}] onError asset count: ${count}`);
} catch {}
};