为什么这个setTimeout根本没有火?

时间:2015-01-29 22:36:55

标签: javascript jquery ajax knockout.js

我正在使用Knockout js,我必须在这里遗漏一些非常概念性的东西。我没有收到错误,因此我很难理解错误的地方。我只想每X秒拉一次数据并用该数据重新填充表格。我正在使用Knockout js进行绑定。此示例代码应足以显示问题:

            function AppViewModel() {
            var self = this;
            self.servers = ko.observableArray([{ Name: 'Loading...', Url: 'Loading...', Environment: 'Loading...', Health: 'Loading...' }]);
            self.refreshServers = function () {
                $.ajax({
                    url: '@Url.Action("GetData", "Temp")',
                    data: { id: 1 },
                    type: 'POST',
                    success: function (data) {
                        self.servers(data);
                        console.log("finished loading data");
                    }
                });
            };
            self.refreshServers();
            setInterval(self.refreshServers, 15000);
        }
        ko.applyBindings(fViewModel);

我直接调用函数self.refreshServers来立即填充数据(也许有更好的方法来执行此操作?)然后我将超时设置为连续调用。我从来没有看到第二个ajax请求,也没有第二个日志功能。

4 个答案:

答案 0 :(得分:1)

函数以()结尾,因此在这种情况下,您的函数可能被称为refreshServers()。另请注意,您将计时器设置为15秒,恕我直言安静。

答案 1 :(得分:1)

setTimeout(self.refreshServers, 15000);在调用AppViewModel()时立即运行。

如你所述,它会立即运行,因为它需要function(){}作为参数才能在所需的15秒后实际执行。

试试这个:

....
setTimeout(function(){
    self.refreshServers();
}, 15000);
.....

**
小心这里; setIntervalsetTimeout不同。

setInterval将在给定的时间间隔内定期运行一段或一段代码,而setTimeout只运行一次(或者每次调用AppViewModel())。如你所说,你的代码运行一次,但可能在你真正希望它运行之前。

答案 2 :(得分:1)

实际上这里有一些问题。

首先,根据您对问题的描述,听起来您可能需要' setInterval()'而不是' setTimeout()'。区别在于' setInterval()'将基于一定的时间间隔连续执行,而“setTimeout()'只会在经过一段时间后执行一次。

第二个问题是,正如其他人所提到的,第一个问题是第一次调用“self.refreshServers()'确实需要括号才能执行第一个调用,并且内部的引用需要setInterval()'不应该有括号。这是因为在' setInterval()'中,您传递的是对将要执行的函数的引用,而不是执行函数的结果。

减去AJAX,这是一个基于代码的工作示例:

function AppViewModel() {
    var self = this;
    self.numberOfIntervals = 0;

    self.servers = ko.observableArray([{
        Name: 'Loading...',
        Url: 'Loading...',
        Environment: 'Loading...',
        Health: 'Loading...'
    }]);

    self.refreshServers = function () {
        // AJAX GOES HERE... THEN UPDATE RESULTS
        self.servers.push({
            Name: 'New Name...' + self.numberOfIntervals,
            Url: 'New Url...' + self.numberOfIntervals,
            Environment: 'New Enviornment...' + self.numberOfIntervals,
            Health: 'New Health...' + self.numberOfIntervals
        });

        self.numberOfIntervals++;
    };

    self.refreshServers();
    setInterval(self.refreshServers, 3000);
}

ko.applyBindings(AppViewModel);

这是一个有效的小提琴:http://jsfiddle.net/dunka494/4/

希望它有所帮助!

答案 3 :(得分:0)

感谢@kinakuta和@Marin Smit指出了我无法理解的显而易见的事实。我显然完全读了setInterval和setTimeout之间的区别。

这两个解决方案是添加括号并从setTimeout更改为setInterval