Javascript 确定布尔值何时从true更改为false

Javascript 确定布尔值何时从true更改为false,javascript,html,Javascript,Html,我有一个有打印按钮的网页。只要按下打印按钮,我就有一个功能 function pWindowNeeded() { if (newPWindowNeeded == 'Y') { return true; } return false; } 然后我有另一个函数,它说如果这是真的,那么打开一个包含要打印的PDF的新窗口,并将newpwindowneded更改为“N” 这一切都很好 另外,当用户现在单击打印窗口时,我会运行此函数 function alertWi

我有一个有打印按钮的网页。只要按下打印按钮,我就有一个功能

function pWindowNeeded() {
    if (newPWindowNeeded == 'Y') {
        return true;
    }
    return false;
}
然后我有另一个函数,它说如果这是真的,那么打开一个包含要打印的PDF的新窗口,并将newpwindowneded更改为“N”

这一切都很好

另外,当用户现在单击打印窗口时,我会运行此函数

function alertWindow()
{
    var w = window.open('','',' width = 200, height = 200, top = 250 , left = 500 ');
    w.document.write("Please Wait<br> Creating Document(s).<br><img src='loadingimage.gif'>");
    w.focus();
    setTimeout(function() {w.close();}, 5000);
}
函数alertWindow()
{
var w=窗开(“”,,“宽=200,高=200,顶=250,左=500”);
w、 文档。写入(“请等待
创建文档)。
”; w、 焦点(); setTimeout(函数(){w.close();},5000); }
这也可以正常工作,创建窗口,然后在5秒钟后自动关闭

目前这很好,但我实际需要的是评估pwindowneded何时返回false,何时返回false,我需要它自动关闭窗口

当pWindowNeeded从true变为false时,最有效的评估方法是什么


谢谢

效率最低、最简单的方法是使用setTimeout轮询值

function callbackWhenWindowNotNeeded(cb) {
    if (!pWindowNeeded()) {
        cb(); 
    } else {
        // The lower the number, the faster the feedback, but the more
        // you hog the system
        setTimeout(callbackWhenWindowNotNeeded, 100);
    }
}

function alertWindow() {
    var w = window.open('','',' width = 200, height = 200, top = 250 , left = 500 ');
    w.document.write("Please Wait<br> Creating Document(s).<br><img src='loadingimage.gif'>");
    w.focus();

    callBackWhenWindowNotNeeded(function() {
        w.close();
    });
}
不需要时的函数回调(cb){
如果(!pwindowneded()){
cb();
}否则{
//数字越小,反馈越快,但反馈越多
//你控制了这个系统
设置超时(当不需要时回调,100);
}
}
函数alertWindow(){
var w=窗开(“”,,“宽=200,高=200,顶=250,左=500”);
w、 文档。写入(“请等待
创建文档)。
”; w、 焦点(); 不需要时回调(函数(){ w、 close(); }); }
理想情况下,您应该使用某种消息总线来防止轮询。这里有一个穷人的公共汽车的例子

var MessageBus = (function(){
   var listeners = [];
   return {
    subscribe: function(cb) {
        listeners.push(cb);
    },
    fire: function(message) {
        listeners.forEach(function(listener){
            listener.call(window);
        });
    }
})();

function alertWindow() {
    var w = window.open('','',' width = 200, height = 200, top = 250 , left = 500 ');
    w.document.write("Please Wait<br> Creating Document(s).<br><img src='loadingimage.gif'>");
    w.focus();

    MessageBus.subscribe(function(message, event) {
        if (message == 'WINDOW_NOT_NEEDED') {
            w.close();
        }
    });
}

// Then wherever you set your newPWindowNeeded
newPWindowNeeded = 'N';
MessageBus.fire('WINDOW_NOT_NEEDED');
var MessageBus=(函数(){
var侦听器=[];
返回{
订阅:功能(cb){
推送(cb);
},
火灾:功能(信息){
forEach(函数(侦听器){
调用(窗口);
});
}
})();
函数alertWindow(){
var w=窗开(“”,,“宽=200,高=200,顶=250,左=500”);
w、 文档。写入(“请等待
创建文档)。
”; w、 焦点(); 订阅(函数(消息、事件){ 如果(消息==“不需要窗口”){ w、 close(); } }); } //那么无论你把你的新电脑放在哪里 newpwindowneded='N'; MessageBus.fire(“不需要窗口”);
你不能再检查一次
newpwindowneded
或者设置另一个标志吗?最好的方法是在使用消息总线设置
pwindowneded
时触发一个事件。糟糕的方法是让
setTimeout
不断运行,出于好奇,检查
pwindowneded
的值,看看代码发生了什么变化
newpwindowneded
to
Y
?触发窗口打开似乎是一种奇怪的方式。@Katana314可能有很多东西,页面上的复选框?由于(或缺少)而超时用户交互…@JuanMendes不需要设置间隔吗?@JOO如果解决了您的问题,请接受答案。尝试
MessageBus
方法,使用类似于我将尝试使用MessageBus的内容。我有一个Try catch,用于检查是否启用了弹出窗口阻止程序,并且出于某种原因,它正在命中该catch。我会把结果告诉你的