当前位置: 首页 > 面试题库 >

等到flag = true

沈凯康
2023-03-14
问题内容

我有这样的javascripthtml" target="_blank">函数:

function myFunction(number) {

    var x=number;
    ...
    ... more initializations
    //here need to wait until flag==true
    while(flag==false)
    {}

    ...
    ... do something

}

问题是javascript卡在了一段时间,卡住了我的程序。所以我的问题是我如何才能在函数中间等待直到标志为真,而无需“忙等待”?


问题答案:

由于浏览器中的javascript是单线程的(webworkers除外,此处未涉及),并且其中一个javascript执行线程在另一个线程可以运行之前运行完毕。

while(flag==false) {}

将会永久运行(或直到浏览器抱怨无响应的javascript循环),该页面似乎已被挂起,并且没有其他javascript可以运行,因此该标志的值永远不会更改。

为了进一步说明, Javascript是一种事件驱动语言
。这意味着它将运行一段Javascript,直到将控制权返回给解释器。然后,只有当它返回解释器时,Javascript才会从事件队列中获取下一个事件并运行它。

计时器和网络事件之类的所有东西都贯穿事件队列。因此,当计时器触发或网络请求到达时,它永远不会“中断”当前正在运行的Javascript。而是将事件放入Javascript事件队列中,然后,当当前正在运行的Javascript完成时,将下一个事件从事件队列中拉出,然后轮流运行。

因此,当您执行无限循环(例如)时while(flag==false) {},当前运行的Javascript将永远不会完成,因此下一个事件也不会从事件队列中拉出,因此no的值flag永远不会改变。他们的关键是
Javascript不是中断驱动的

。计时器触发时,它不会中断当前正在运行的Javascript,不会运行其他一些Javascript,然后继续运行当前正在运行的Javascript。只是将其放入事件队列中,等待当前运行的Java脚本运行完毕。

您需要做的是重新考虑代码的工作方式,并找到另一种方法来在flag值更改时触发要运行的任何代码。Javascript被设计为事件驱动的语言。因此,您需要做的是弄清楚可以注册感兴趣的事件,以便可以侦听可能导致标志更改的事件,然后可以检查该事件上的标志,也可以触发自己的事件无论什么代码可能会更改标志,或者您可以实现一个回调函数,无论代码发生了什么变化,只要负责更改标志值的代码片将其值更改为,该标志就可以调用您的回调true,它只会调用回调函数,因此您的代码当标志设置为时要运行true将在正确的时间运行。这比尝试使用某种计时器来不断检查标志值要有效得多。

function codeThatMightChangeFlag(callback) {
    // do a bunch of stuff
    if (condition happens to change flag value) {
        // call the callback to notify other code
        callback();
    }
}


 类似资料:
  • import "flag" flag包实现了命令行参数的解析。 要求: 使用flag.String(), Bool(), Int()等函数注册flag,下例声明了一个整数flag,解析结果保存在*int指针ip里: import "flag" var ip = flag.Int("flagname", 1234, "help message for flagname") 如果你喜欢,也可以将fl

  • 设置修改器,使得随后的事件导向这样一种情况,允许客户端在没有做好接受数据的准备时丢失消息数据,详细翻译去上边找哈~。 io.on('connection', (socket) => { socket.volatile.emit('an event', { some: 'data' }); // the client may or may not receive it });

  • 设置修改器,是的随后的事件导向这样一种情况,即除了主动广播消息的客户端以外,将随后的事件消息广播给所有的socket。 io.on('connection', (socket) => { socket.broadcast.emit('an event', { some: 'data' }); // everyone gets it but the sender });

  • 设置修改器,将随后的事件导向这样一种情况:即事件数据仅广播给当前节点(当使用了Redis adapter)。 io.local.emit('an event', { some: 'data' });

  • 设置修改器,将随后的事件触发导向这样一种情况:即如果当客户端没有做好接受信息的准备时(可能由于网络故障或者其他问题导致的,或者连接方式采用长轮询的方式,而恰好响应接受消息的事件此时还在请求-响应循环列表中未被触发),那么允许服务器发送的数据丢失。 io.volatile.emit('an event', { some: 'data' }); // the clients may or may no

  • Add or remove one or more classes from the element, depending on either the class’s presence or the value of the flag argument. Parameters valuestringclass name or space separated list ofclass names f