Javascript使用promise等待条件为真

T M*_*ack 4 javascript asynchronous async-await electron

我正在努力在程序中创建一个简单的等待功能。我想使用Promise并尽可能地异步等待。到目前为止,我有:

 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();
Run Code Online (Sandbox Code Playgroud)

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

'before'
'met'
'after'
Run Code Online (Sandbox Code Playgroud)

Pet*_*der 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();
Run Code Online (Sandbox Code Playgroud)

我重构了一下您的代码。要获取当前时间,请使用Date.now()。并且您可以在resolve没有1毫秒超时的情况下进行调用。