gpt4 book ai didi

javascript - 监听js变量变化

转载 作者:行者123 更新时间:2023-12-05 00:38:22 25 4
gpt4 key购买 nike

假设 中有一个代码地点 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com