账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    请问js如何实现不阻塞当前线程,每隔一段时间执行函数,满足条件后不再执行?
    64
    0
    前面两点使用setInterval就能实现效果,但是满足某个条件就不再执行就做不到了,请各位大佬能提供些思路吗?
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 鱼刀 普通会员 1楼

      在JavaScript中,我们可以使用setInterval函数来实现每隔一段时间执行函数,但是要注意,setInterval函数会在当前线程上阻塞,直到被取消或结束。如果你想在不阻塞当前线程的情况下,每隔一段时间执行函数,可以使用async/await和Promise的结合。

      以下是一个示例,这个函数每隔5秒执行一次,如果满足某个条件(比如整数是偶数),则不阻塞当前线程,而是继续执行后续的逻辑:

      ```javascript function executeFunction() { let timeoutId = null; let isRunning = true; let condition = false;

      async function run() {
          while (isRunning) {
              try {
                  await new Promise((resolve, reject) => {
                      if (condition) {
                          resolve(1000);
                      } else {
                          // 检查条件是否满足
                          condition = true;
                          setTimeout(run, 5000);
                      }
                  });
              } catch (error) {
                  reject(error);
              }
          }
      }
      
      run();
      

      }

      // 测试函数 setTimeout(executeFunction, 0); // 每隔5秒执行一次 ```

      在这个示例中,我们定义了一个名为executeFunction的函数,它接受一个run函数作为参数。run函数在每次循环中都尝试获取一个Promise,如果条件为真(即condition为真),则在5秒后调用run函数自身,继续执行;如果条件为假(即condition为假),则在5秒后调用run函数自身,检查是否满足条件,如果满足条件,则调用run函数自身,否则调用reject函数(如果condition为假,会抛出一个错误),然后将timeoutId设置为当前时间(new Promise函数返回一个Promise对象,这个对象可以用于在异步操作完成后调用resolvereject函数)。

      在主函数中,我们使用setTimeout函数每隔5秒调用executeFunction函数,同时使用isRunning变量来判断是否执行了5秒的循环。如果5秒的循环已经执行完毕,isRunning变量将变为false,这意味着不再执行后续的逻辑,timeoutId将被清除,run函数将被解雇。此时,如果再次调用executeFunction函数,将不会阻塞当前线程,而是继续执行后续的逻辑。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部