处理异步需要等待异步数据加载完成,在执行后续操作
// 工具:sleep
const sleep = ms => new Promise(r => setTimeout(r, ms));
/**
* 等待断言为真
* @param predicate 返回 true 表示已 ready
* @param interval 轮询间隔
* @param maxTimes 最大次数
*/
async function waitUntil(predicate, interval = 500, maxTimes = 30) {
for (let i = 0; i < maxTimes; i++) {
if (predicate()) return; // 成功立即结束
await sleep(interval);
}
throw new Error('waitUntil: 超出最大轮询次数');
}
/* ---------- 业务调用 ---------- */
async openSettingDialog() {
// 等待初始化完成
await waitUntil(() => this.initSuccess && this.$refs.tableSettings);
// 后续逻辑
this.handleSettings();
}
- 无递归、无手动
setTimeout,代码更扁平; predicate纯函数,易测试;- 间隔 & 次数可配置,默认一次 500 ms、最多 15 秒;
- 失败抛错,调用方可
try/await统一处理。