常用方法记录

13 阅读1分钟

处理异步需要等待异步数据加载完成,在执行后续操作

// 工具: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 统一处理。