如何强制javascript在移动到下一行之前执行一行?

如何强制javascript在移动到下一行之前执行一行?,javascript,jquery,Javascript,Jquery,我有几个过滤器可以显示或隐藏表中的表行,然后检查是否没有可见的行,然后向表中添加一条消息,说明不存在行 这就是我试图做到的,但失败得很惨,也许我不知道JS执行行的方式,也许总是异步的 HTML 我的意思是它执行它,但不进行更改,例如,在执行if语句之前,它不会隐藏任何行 请注意,我在不同的地方使用了checkfurtexists,所以我想将它分开。JavaScript和DOM的操作是单线程的。浏览器的工作原理是将项目放置在队列中,然后一个接一个地执行它们。当您更新DOM时,实际发生的是它将更新它

我有几个过滤器可以显示或隐藏表中的表行,然后检查是否没有可见的行,然后向表中添加一条消息,说明不存在行

这就是我试图做到的,但失败得很惨,也许我不知道JS执行行的方式,也许总是异步的

HTML

我的意思是它执行它,但不进行更改,例如,在执行if语句之前,它不会隐藏任何行


请注意,我在不同的地方使用了
checkfurtexists
,所以我想将它分开。

JavaScript和DOM的操作是单线程的。浏览器的工作原理是将项目放置在队列中,然后一个接一个地执行它们。当您更新DOM时,实际发生的是它将更新它的请求放在队列的末尾,因此它将在JavaScript运行完成后发生。在这种情况下,您需要做的是强制第二个函数转到这个队列的末尾,这样它就可以在DOM操作发生后运行。可以通过将对函数的调用包装为零超时来实现这一点:

window.setTimeout(CheckFruitExists, 0);
这将导致它被添加到执行队列的末尾,现在应该在DOM更新发生后运行

更新:

根据我的评论,将考虑动画循环中的元素:

在隐藏某个元素的动画中,该元素在动画结束之前都视为可见。在显示元素的动画过程中,该元素在动画开始时被视为可见


这意味着当运行
checkfurtexists
函数时,该元素仍将处于动画状态,并将被视为可见,而不管它是隐藏还是显示。请尝试删除动画,看看这是否解决了问题(您可能仍需要如上所述使用
setTimeout
fix)。如果确实如此,并且您仍然希望使用动画,则需要调用
hide
show
的动画完整回调函数中的
checkfurtexists

HTML最终如何呈现到页面?我从来没有听说过标签。你如何确认执行流程?@Vishwanath使用开发人员工具检查了它,提到了已经有问题的:-)你能共享一个plunker吗…@JyotiPuri plunker?不幸的是,这不起作用,我添加了一个断点,在检查行是否隐藏之前它不会隐藏行:'(它们最终会被隐藏吗?即隐藏它们的代码真的有效吗?不,它们不会马上被隐藏,它们只会在我让代码流动时被隐藏好-所以它确实有效。尝试使用1ms超时而不是基于0的超时,可能是浏览器看到了0,只是跳过了超时,而不是将其添加到末尾。)E QuealeA-另一件事是jQuery动画。jQuery会考虑到隐藏动画已经完成的事情,并且当动画开始时,可能是if语句永远不会小于1。
function ToggleFruits(elm) {
    $target = $('#fruitTable tr[data-status="' + elm.id + '"]').filter(function () {
        var crates = $("#crateTable tr .selected").parent().map(function () {
            return $(this).data("crateID");
        }).get();
        return crates.indexOf($(this).data("crateID")) >= 0;
    });

    if (elm.checked) {
        $target.show("down");
    }
    else {
        $('#fruitTable tr[data-status="' + elm.id + '"]').hide("up");
    }

    CheckFruitExists();
}


function CheckFruitExists() {
    $("#NoFilteredFruits").hide();
    $("#fruitTable").show();

    if ($("#fruitTable tr:visible").length < 1) {
        $("#NoFilteredFruits").show();
        $("#fruitTable").hide();
    }
}
if ($("#fruitTable tr:visible").length < 1)
 else {
            $('#fruitTable tr[data-status="' + elm.id + '"]').hide("up");
        }
window.setTimeout(CheckFruitExists, 0);