/ JavaScript

#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