亚洲步兵一区二区三区-日韩精品伦理在线一区-亚洲色诱视频免费观看-久久人妻视频免费观看

廣州總部電話:020-85564311
廣州總部電話:020-85564311
20年
互聯網應用服務商
請輸入搜索關鍵詞
知識庫 知識庫

優網知識庫

探索行業前沿,共享知識寶庫

如何優雅地實現 JavaScript 異步等待?一個超實用的 waiting 函數

發布日期:2025-08-13 14:54:20 瀏覽次數: 835 來源:同心同德丨技術內核
推薦語
告別 setTimeout 嵌套!這個 waiting 函數讓你優雅解決各種異步等待場景,代碼更簡潔、維護更輕松。

核心內容:
1. 傳統異步等待方案的痛點分析
2. waiting 函數的核心實現原理與特性
3. 實際開發中的典型應用場景示例
小優 網站建設顧問
專業來源于二十年的積累,用心讓我們做到更好!
在日常开发中,你是否遇到过这样的场景?
  • 等待某个 DOM 元素加载完成
  • 等待某个全局变量被初始化
  • 等待第三方 SDK 加载成功
  • 等待某个状态变为 true 才执行后续逻辑

传统的做法可能是用 setTimeout 层层嵌套,或者监听事件,但这些方式要么不够灵活,要么难以维护。

今天,我分享一个简洁、可复用、支持 Promise 的异步等待函数 —— waiting(),让你轻松应对各种“等一等再执行”的需求!


🔧 什么是 waiting 函数?

waiting 是一个基于 轮询 + Promise 实现的异步等待工具。它会以固定频率检查某个条件是否成立,一旦满足,立即触发后续操作。

✅ 核心特性:

  • 支持自定义判断条件
  • 可设置最大重试次数,防止无限循环
  • 可配置轮询间隔时间
  • 返回 Promise,完美融入现代异步编程

💡 核心代码实现

javascript

深色版本

/**
 * 异步等待条件成立
 * @param {Function}condition - 条件函数,返回 true 或 false
 * @param {Number}maxCount - 最大重试次数,默认 500
 * @param {Number}timer - 轮询间隔(毫秒),默认 10ms
 * @returns {Promise}
 */
function waiting(condition, maxCount = 500, timer = 10{
    let retryCount = 0;
    return new Promise((resolve, reject) => {
        const myInterval = setInterval(() => {
            // 条件满足,成功 resolve
            if (condition()) {
                clearInterval(myInterval);
                resolve();
            }

            // 超出最大重试次数,清除定时器(可选 reject)
            if (retryCount >= maxCount) {
                clearInterval(myInterval);
                // 可根据需要 reject(new Error('Timeout'))
            }

            retryCount++;
        }, timer);
    });
}

🛠️ 使用示例

示例 1:等待 DOM 元素出现

javascript

深色版本

waiting(() => {
    return document.getElementById('app') !== null;
}).then(() => {
    console.log('DOM 元素 #app 已加载,开始初始化...');
    // 执行后续操作
});

示例 2:等待全局变量就绪

javascript

深色版本

// 假设第三方 SDK 异步加载后会挂载 window.MySDK
waiting(() => !!window.MySDK)
    .then(() => {
        console.log('MySDK 已加载,可以调用 API');
        MySDK.init();
    });

示例 3:等待状态变更

javascript

深色版本

let isLoading = true;

// 模拟异步加载完成
setTimeout(() => {
    isLoading = false;
}, 2000);

// 等待加载结束
waiting(() => !isLoading).then(() => {
    console.log('加载完成,执行下一步!');
});

⚙️ 参数说明

参数
类型
默认值
说明
condition
Function
必填
返回布尔值的条件函数
maxCount
Number
500
最多重试次数(防止死循环)
timer
Number
10
轮询间隔(毫秒)

⚠️ 提示:maxCount=500 + timer=10ms 表示最多等待 5秒。可根据实际场景调整。


🌟 为什么推荐这个方案?

方案
缺点
waiting 优势
setTimeout
 嵌套
难维护、易出错
结构清晰、Promise 链式调用
事件监听
需要手动触发
自动轮询,无需外部干预
MutationObserver
复杂、兼容性要求高
简单通用,兼容性好

✅ 轻量无依赖
✅ 逻辑清晰易懂
✅ 适用于多种异步等待场景


📌 小贴士

  • 如果希望超时后抛出错误,可以在 retryCount >= maxCount 时调用 reject()
  • 对性能敏感的场景,可适当调大 timer,减少 CPU 占用
  • 推荐封装成工具函数,全局复用

📣 结语

waiting 函数虽小,却能解决大问题。它让“等待”这件事变得可控、可预测、可维护。无论是 SPA 应用、插件开发,还是自动化脚本,都非常实用。

優網科技,優秀企業首選的互聯網供應服務商

優網科技秉承"專業團隊、品質服務" 的經營理念,誠信務實的服務了近萬家客戶,成為眾多世界500強、集團和上市公司的長期合作伙伴!

優網科技成立于2001年,擅長網站建設、網站與各類業務系統深度整合,致力于提供完善的企業互聯網解決方案。優網科技提供PC端網站建設(品牌展示型、官方門戶型、營銷商務型、電子商務型、信息門戶型、微信小程序定制開發、移動端應用(手機站APP開發)、微信定制開發(微信官網、微信商城、企業微信)等一系列互聯網應用服務。


我要投稿

姓名

文章鏈接

提交即表示你已閱讀并同意《個人信息保護聲明》

專屬顧問 專屬顧問
掃碼咨詢您的優網專屬顧問!
專屬顧問
馬上咨詢
聯系專屬顧問
聯系專屬顧問
聯系專屬顧問
掃一掃馬上咨詢
掃一掃馬上咨詢

掃一掃馬上咨詢

和我們在線交談!
主站蜘蛛池模板: 亚洲成人一区二区三区精品| 亚洲精品在线观看一区二区| 老湿机69福利视频在线观看| 天堂中文在线资源色| 午夜性色一区二区三区不卡视频| 蜜臀久久99精品久久久宅男| 国产精品日韩免费视频| 亚洲精品蜜桃一区二区| 日韩一区在线观看免费| 亚洲在线一区二区免费| 欧美在线中文字幕一区| 天天干天天色天天色综合| 高清一区二区三区四区| 免费欧美一区二区在线观看| 国产一区二区三区免费在线| 中文字幕av不卡片段在线播放| 国产伦精品一区二区三区视频黑人| 中文字幕人妻免费在线| 一区二区三区日本人妻| 欧美日韩一区二区三区四区| 国内自拍偷拍一区二区| 精品国产乱码视频一区二区三区| 夜夜操视频观看网站大全 | 欧美一区在线免费播放| 国产盗摄视频精品一区二区三区| 一区二区三区午夜探花| 欧美日韩综合一区在线| av中文字幕综合久久| 98日韩精品人妻一二区| 色哟哟在线观看一区二区三区| 一级片中文字幕在线观看| 亚洲一区二区成人精品在线观看| 亚洲av上原亚衣在线一区二区 | 一区二区三区啪啪啪午夜| 日韩av中文字幕八区| 五月天网站一区二区三区| 国产成人免费av在线播放欲色| 懂色国产精品一区二区| 午夜区二区三区不卡顿| 精品国产一二三四五区| 在线情色av一区二区|