#TypeScript 异步等待方法的实现
一个超时等待的js/ts实现
问题背景
简单说,在进行B操作前,需要等待A操作结束,或者某个条件满足,比如ready标志位变成true,这时候需要一个异步等待的方法。
解决方法
需要两个步骤:
- 1). 定时轮询,检查条件是否满足
- 2). 超时判定,在条件一直无法满足时,可以抛出超时异常
代码示例
function waitUntil(condition:()=>boolean, timeout?:number, interval?:number) { if (timeout === void 0) { timeout = 0; } // 如果不设置超时参数,表示永不超时,一直等待 if (interval === void 0) { interval = 50; } // 默认查询间隔50ms let waitHandler; let timeoutHandler; return new Promise<void>(function (resolve, reject) { var waitFn = function () { if (condition()) { if(timeoutHandler){ clearTimeout(timeoutHandler); } resolve(); } else { waitHandler = setTimeout(waitFn, interval); } }; // 定时检查 waitHandler = setTimeout(waitFn, interval);// 超时判定 if(timeout>0){ timeoutHandler = setTimeout(()=>{ if(waitHandler){ clearTimeout(waitHandler); } reject({ code:"TIMEOUT", message: "timeout" }); }, timeout); } });
} export { waitUntil };
使用方法
- 1). 对于必须满足条件才能进行的操作,不用提供超时参数
// 必须在sdk初始完毕后才能进行
await waitUntil(() => {
return sdk.isReady();
});
- 2). 对于允许超时的操作,即最多等待多久的操作
// 等待1000毫秒(1秒)
await waitUntil(() => {
return sdk.isReady();
}, 1000);
gist
https://gist.github.com/zhangzhibin/dfd192da8c2db6964ee901a642bacaa1