2016-07-26 2 views
1

Я пытаюсь реализовать простой механизм опроса с помощью setInterval. У меня есть ViewModel следующим образом:Выполнение опроса с использованием setInterval в приложении для нокаута?

define([ 'knockout', 'jquery', 
    ], function (ko, $) { 
    function ViewModel() { 
     var self = this; 
     //setInterval(function() { 
     $.ajax({url: "", async: false,timeout: 3000, success: function (data) { 
      // some operation 

      }, dataType: "json"}); 
     //}, 3000); 

    } 
    return ViewModel; 


}); 

Upto это работает отлично АЯКС возврат вызова данных и не operation.How я использую setInterval так, что возвращает Аякс вызова данных после определенного интервала, так что ViewModel обновляется и данные взбодрятся в пользовательском интерфейсе? Если я раскомментирую блок setInterval, то ViewModel не будет возвращен в DOM. Я думаю, что setInterval является асинхронным. Любые решения оцениваются.

+0

Можете ли вы сделать воспроизводимый пример на jsfiddle? У них есть [служба эха AJAX] (http://doc.jsfiddle.net/use/echo.html), которую вы можете использовать, чтобы иметь AJAX в вашем примере. –

ответ

1

В принципе, использование setInterval с асинхронным кодом - не лучший способ. Лучше использовать setTimeout, чтобы запланировать новый запрос, как только предыдущий закончен.

Если вы убедитесь, что одновременно не может быть два ожидающих запроса, вы можете получить доступ к своему ViewModel экземпляру через self в своем обработчике успеха, и вам не придется беспокоиться о старых/других запросах, отменяющих ваши изменения.

Вот пример:

function ViewModel() { 
 
    var self = this; 
 

 
    var INTERVAL = 5000; 
 
    var timeout = null; 
 
    var currentReq = null; 
 
    
 
    this.observableProp = ko.observable("empty"); 
 

 
    var fetchNewData = function() { 
 
    currentReq = $.ajax(/* options */); 
 
    
 
    currentReq 
 
     .done(processNewData) 
 
     .always(scheduleNewDataFetch); 
 
    }; 
 

 
    var processNewData = function(data) { 
 
    // self refers to your current ViewModel instance 
 
    // set observable properties using self.prop(data) 
 
    self.observableProp("data"); 
 
    }; 
 
    
 
    var scheduleNewDataFetch = function() { 
 
    if (currentReq) { 
 
     currentReq.abort(); 
 
    } 
 
    
 
    if (timeout) { 
 
     clearTimeout(timeout); 
 
    } 
 
    
 
    currentReq = null; 
 
    timeout = setTimeout(fetchNewData, INTERVAL); 
 
    
 
    }; 
 

 
    fetchNewData(); // Starts the update loop 
 
}

+0

Ваше решение довольно хорошо, но даже определить ([ 'нокаута', 'JQuery', ], функция (Ко, $) { функция ViewModel() {// ваша реализация } возвращение ViewModel; }); возвращает ViewModel как unifined. Я что-то не хватает? –

+0

Боюсь, что это другая проблема и на самом деле не связана с этим вопросом. Попробуйте googling для «amd define возвращает undefined» или задайте новый вопрос с соответствующими тегами и кодом. Возможно, это круговая зависимость, которая знает ... – user3297291

-1

Вы можете попробовать просто делать:

define([ 'knockout', 'jquery', 
    ], function (ko, $) { 
    function ViewModel() { 
     var self = this; 
     var refreshInterval = /* your refresh interval in ms here*/; 
     setInterval(function() { 
      $.ajax({url: "", async: false, success: function (data) { 
       // some operation 

       timeout: refreshInterval 
       }, dataType: "json"}); 
     }, refreshInterval); 

    } 
    return ViewModel; 

}); 

Аякса вызов выполняется каждый refreshInterval (в мс). Свойство timeout - это безопасность, чтобы быть уверенным, что ответ, который вы получаете за один интервал, - это данные этого интервала, а не данные из ранее оставшегося без ответа вызова, который опоздал.

+0

Не работает ViewModel не возвращается в html. –

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