代码之家  ›  专栏  ›  技术社区  ›  T Mack

Javascript使用承诺等待条件为true

  •  9
  • T Mack  · 技术社区  · 7 年前

     function waitForCondition(conditionObj) {
       var start_time = new Date().getTime()
    
       function checkFlag() {
         if (conditionObj.arg == conditionObj.test) {
           console.log('met');
           return new Promise(resolve => setTimeout(resolve, 1));
         } else if (new Date() > start_time + 3000) {
           console.log('not met, time out');
           return new Promise(resolve => setTimeout(resolve, 1));
         } else {
           window.setTimeout(checkFlag, 1000); 
         }
       }
       checkFlag();
     }
    
      async function run() {
        console.log('before');
        await waitForCondition({arg: '1', test: '1'})
        console.log('after');
      }
      run();
    

    它应每1秒检查一次,最长时间为3秒。控制台应如下所示:

    'before'
    'met'
    'after'
    
    3 回复  |  直到 3 年前
        1
  •  12
  •   PeterMader    7 年前

    你必须这么做 return

    function waitForCondition(conditionObj) {
      return new Promise(resolve => {
        var start_time = Date.now();
        function checkFlag() {
          if (conditionObj.arg == conditionObj.test) {
            console.log('met');
            resolve();
          } else if (Date.now() > start_time + 3000) {
            console.log('not met, time out');
            resolve();
          } else {
            window.setTimeout(checkFlag, 1000); 
          }
        }
        checkFlag();
      });
    }
    
    async function run() {
      console.log('before');
      await waitForCondition({arg: '1', test: '1'})
      console.log('after');
    }
    run();
    

    我对你的代码进行了一些重构。要获取当前时间,请使用 Date.now() .你应该可以打电话 resolve 没有1毫秒的超时。

        2
  •  2
  •   Bergi    7 年前

    我相信你真正想要的是

    function waitForCondition(conditionObj) {
      var start_time = new Date().getTime()
    
      async function checkFlag() {
        if (conditionObj.arg == conditionObj.test) {
          console.log('met');
           // return something?
        } else if (new Date() > start_time + 3000) {
          console.log('not met, time out');
          // throw some error?
        } else {
          await new Promise(resolve => setTimeout(resolve, 1000));
          return checkFlag();
        }
      }
      return checkFlag();
    }
    

    或者用循环代替递归

    async function waitForCondition(conditionObj) {
      var start_time = new Date().getTime()
    
      while (true) {
        if (conditionObj.arg == conditionObj.test) {
          console.log('met');
          break; // or return
        }
        if (new Date() > start_time + 3000) {
          console.log('not met, time out');
          break; // or throw
        }
        await new Promise(resolve => setTimeout(resolve, 1000));
      }
    }
    
        3
  •  0
  •   Ulysse BN    7 年前

    waitForCondition 隐式返回 undefined .尝试在末尾添加一个返回语句:

    return checkFlag();
    

    正如评论中提到的,有一个条件 checkFlag() 未定义 您可能希望通过返回 Promise .