#TypeScript 异步等待方法的实现
问题背景
简单说,在进行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