javascript - 我可以信任 setTimeout(fn, 0),还是应该使用替代方案?

标签 javascript ecmascript-6 aurelia

虽然很多问题和答案告诉我 setTimeout(0) 的用途和用途,但我找不到一个很好的替代方案。

我的问题

我有一个点击处理程序,它执行一个函数,通知另一个类更新其状态。

该点击处理程序位于父元素上。

我在该元素内有一个复选框,可以选中或取消选中该复选框。

因为单击处理程序位于父元素上,所以首先调用它。但我需要我的复选框在发送信号之前更改状态。

因此,我使用 setTimeout(0) 来防止在选中复选框之前发送信号。

HTML

<div click.delegate="update()">
    <div class="checkbox">
        <label>
            <input checked.bind="group.validated" type="checkbox"> Visibility
        </label>
    </div>
</div>

Javascript

update(){
    setTimeout(()=>{
        this.signaler.signal('refresh-groups');
    }, 0);
    return true;
}

基本上,发生的事情是 return true;this.signaler.signal 函数之前执行。这样,在发送信号之前会检查该复选框。 请注意,这在首先更新复选框状态的常规 onclick 方法中不会发生,但这是 Aurelia 框架的行为方式。

我不喜欢我在这里创造的感觉。超时 0 秒意味着该函数位于调用堆栈的末尾,仅此而已。如果我的 return true; 语句发生任何事情导致它等待 0.1 秒,我也会面临同样的问题。

有没有更值得信赖的替代方案?仅仅使用 Promise 似乎并不能解决问题。

最佳答案

我认为主要问题是您使用的 click 事件在输入元素的值更改之前触发。请改用 change 事件。

https://gist.run/?id=863282464762b54c8cf67de541bac4d3

关于javascript - 我可以信任 setTimeout(fn, 0),还是应该使用替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38853915/

相关文章:

javascript - 插入 DIV 后的脚本执行

javascript - boolean 测试作为参数

javascript - 需要帮助让正则表达式获取两个不相关的字符串之间的内容

ecmascript-6 - 在服务 worker 中使用 browser.js

javascript - Promise.all()中如何使用if表达式?

aurelia - 获取更改事件中选定的选项值

javascript - Aurelia 将数据传递到模板的可绑定(bind)值中

javascript - 使用 jQuery 将 td 附加到表中的 tr

javascript - Webpack:意外的 token 导入

javascript - Aurelia 绑定(bind)行为如何增强 innerHTML 内容?