javascript - 监听js变量变化

标签 javascript typescript scope window

假设 中有一个代码地点 2

var place2IsReady = true;
地点 1 我需要实现以下逻辑:
Once place2IsReady value was changed (to true) then display alert('ready!');
笔记:
  • place2IsReady 变量在 范围内不可用地点 1 .
  • 来自 的代码地点 1 之前执行地点 2 被执行(或存在竞争条件)。

  • 解决方案一
    我相信我可以改用 window.place2IsReady 并使用 setTimeout/setInterval 代替 1 直到我得到 window.place2IsReady === true .
    有更好的选择吗?使用监听器?关于变量的变化?
    附言我需要追踪 只有第一个可能的改变 place2IsReady。
    有没有更好的办法?谢谢你。

    最佳答案

    您可以使用 setTimeout 创建变量更改的监听器。 , 就像是:

    let place2IsReady = false;
    
    setReadyListener();
    
    // testing wait 2 seconds to set place2IsReady to true
    // so: an alert should occur after 2 seconds
    setTimeout(() => place2IsReady = true, 2000);
    
    function setReadyListener() {
      const readyListener = () => {
        if (place2IsReady) {
          return alert("Ready!");
        }
        return setTimeout(readyListener, 250);
      };
      readyListener();
    }

    更通用的监听器“工厂”可能是:

    let place2IsReady = false;
    let fromObj = {
      place2IsReady: "busy",
      done() { this.place2IsReady = "done"; },
    };
    const listen = changeListenerFactory();
    
    listen(
      () => place2IsReady, 
      () => console.log("place2IsReady") );
    listen(
      () => fromObj.place2IsReady === "done", 
      () => console.log("formObj.place2IsReady done!") );
      
    console.log("Listening...");
    
    // test change variables with listeners
    setTimeout(() => place2IsReady = true, 1000);
    setTimeout(() => fromObj.done(), 3000);
    
    function changeListenerFactory() {
      const readyListener = (condition, callback, delay) => {
        if (!condition || typeof condition !== "function") { return true; }
        if (condition()) {
          return callback();
        }
        setTimeout(() => readyListener(condition, callback, delay), delay);
      };
      
      return (condition, callback = () => {}, delay = 250) => 
        readyListener(condition, callback, delay);
    }

    或者也许使用 Proxy (带有固定陷阱)为您工作

    const readyState = new Proxy({ ready: false }, { 
      set (target, prop, val) {
        console.log(`readyState.ready changed from ${target[prop]} to ${val}`);
        target[prop] = val;
      }
    });
    
    console.log("Waiting for changes ...");
    setTimeout(() => readyState.ready = true, 2000);

    关于javascript - 监听js变量变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65937827/

    相关文章:

    javascript - 如何在没有空回调的情况下测试多个调用

    java - 为什么 Spring 会从 Singleton 类创建 2 个对象?

    c++ - 从方法范围复制 char*

    javascript - 谷歌地图API动画多边形颜色变化

    Javascript 如何迭代并查找 NodeList 中的特定元素

    typescript 泛型 : Refer to class instead of instance

    unit-testing - 如何在测试中设置由构造函数填充的私有(private)字段?

    typescript - Typescript中协变和逆变位置的区别

    javascript - 我可以在匿名范围内更改 Javascript 闭包中引用的函数吗

    javascript - 使用回调将两个数字相加和相乘