查询setTimeout()

时间:2013-10-10 12:19:19

标签: javascript

自从过去几个月以来,我一直在做很多JS,但我从来没有真正在大学/书籍等中学到它。

这是一个问题:

$scope.selectTab = function($index, tab) {
    $scope.template = $scope.templates[$index];
    $scope.data.tabSelected = tab;
    setTimeout(function() {
        console.clear();
        console.log($scope.template);
        console.log(document.getElementById("SomeDiv"))
        console.log("Going to draw now...")
        draw_analytics($scope); // Draw on SomeDiv
    }, 0);
}

而上述代码有效;但下面没有。

$scope.selectTab = function($index, tab) {
    $scope.template = $scope.templates[$index];
    $scope.data.tabSelected = tab;
    console.clear();
    console.log($scope.template);
    console.log(document.getElementById("SomeDiv"))
    console.log("Going to draw now...")
    draw_analytics($scope);
}

我正在使用AngularJS进行一些标记,但我认为这无关紧要。 在顶部代码中,当我尝试获取SomeDiv dom时,我实际上得到了它的HTML内容,而在底部代码中,返回了null

1 个答案:

答案 0 :(得分:1)

将settimeout与匿名函数一起使用时,它不会立即执行。它将它添加到当前事件结束后要执行的队列中。

这与没有settimeout运行它相反,settimeout只是立即执行它。

如果我不得不猜测,“SomeDiv”正在使用标签更改进行创建或操作。因此,立即运行代码可能会导致代码在div实际创建之前执行。调用“settimeout”时将等到当前事件完成后再执行。虽然看起来它与事件内联,但它实际上只是安排匿名函数在最后运行。

我创造了一个小提琴来说明我在说什么。 http://jsfiddle.net/pS54r/

使用settimeout的第一个按钮,第二个按钮没有。

$('#clickme').click(function () {
    WriteToDiv('First Button 1');
    setTimeout(function () {
        WriteToDiv('First Button 2');
    }, 0);
    WriteToDiv('First Button 3');
});

$('#clickme2').click(function () {
    WriteToDiv('Second Button 1');
    WriteToDiv('Second Button 2');
    WriteToDiv('Second Button 3');
});