2015-01-29 3 views
0

Я использую Knockout js, и мне, должно быть, что-то не хватает, что очень концептуально. Я не ошибаюсь, поэтому мне трудно понять, в чем я ошибаюсь. Я просто хочу извлекать данные каждые X секунд и повторно заполнять таблицу этими данными. Я использую Knockout js для привязок. Этот пример код должен быть достаточным, чтобы отобразить вопрос:Почему этот setTimeout вообще не срабатывает?

  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 и не запускается вторая функция журнала.

+2

Ваше первое я.refreshServers вызов не имеет никакого вызова - должен быть self.refreshServers() - те, которые должны быть там, должны быть – kinakuta

+0

Как-то он все еще вызывает функцию один раз. Первоначально у меня была self.refreshServers = новая функция, поэтому я думаю, поэтому у меня не было парнеров в какой-то момент. – Tada

+1

он называет его один раз из-за вызова setTimeout – kinakuta

ответ

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/

Надеется, что это помогает!

1

Функции заканчиваются на (), поэтому в этом случае ваша функция может называться refreshServers(). Также обратите внимание, что вы устанавливаете таймер на 15 секунд, в котором ИМХО тихонько.

+0

Спасибо за отзыв. В настоящее время операция по извлечению данных немного длинная, поэтому в моем случае 15 секунд в порядке. Однако я вернусь к этому позже. – Tada

+0

Вы также можете запустить действие, когда вызов ajax завершен. Поместите код между 'success: function (data) { self.refreshServers(); } ' – Matt

1

setTimeout(self.refreshServers, 15000); запускается сразу же, когда вызывается AppViewModel().

Как вы заявили, он запускается немедленно, потому что ему необходимо function(){} в качестве параметра для фактического выполнения после желаемых 15 секунд.

попробуйте вместо этого:

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

**
быть осторожным; setInterval - это не то же самое, что и у setTimeout.

setInterval будет работать кусок или блок кода периодически в заданном интервале, в то время как setTimeout будет работать только один раз (или, скорее, каждый раз, когда вызывается AppViewModel()). как вы сказали, ваш код запускается один раз, но, вероятно, до того, как вы действительно хотите его запустить.

0

Благодаря @kinakuta и @Marin Smit за то, что я заметил, что я не понял. Я, по-видимому, слишком быстро прочитал разницу между setInterval и setTimeout.

Два раствора добавление скобки и переходя от SetTimeout к setInterval

Смежные вопросы