2016-07-26 11 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; 


}); 

それは細かいAJAX呼び出しの戻りデータを動作し、operation.How私はViewModelには、更新されたデータとなるように一定の間隔の後にAjaxの呼び出しが戻るデータがリフレッシュされるようにしたsetIntervalを使うのですかんUIで? setIntervalブロックのコメントを外すと、ViewModelはDOMに返されません。setIntervalは非同期であると思います。どんな解決策もありがとうございます。

+0

あなたはjsfiddleに再現可能な例を作ることはできますか?彼らはあなたの例でAJAXを使うために使うことができる[AJAXエコーサービス](http://doc.jsfiddle.net/use/echo.html)を持っています。 –

答えて

1

基本的には、setIntervalと非同期コードを使用するのが最善の方法ではありません。新しいリクエストが完了したら、setTimeoutを使用して新しいリクエストをスケジュールする方が良いでしょう。あなたが一度に2つの保留中の要求があることができないことを確認した場合

することは、あなたはあなたの成功ハンドラでselfを通して、あなたのViewModelインスタンスにアクセスすることができますし、あなたの変更を元に戻す古い/他の要求を心配する必要はありません。

はここに例を示します

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の'、 ]を、機能(KO、$){ 関数ViewModelに(){ //実装 は}のViewModelを返す ; }); ViewModelをundifinedとして返しています。何か不足していますか? –

+0

私はそれが別の問題であり、本当にこの質問には関係しないと恐れています。 「amd define returns 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; 

}); 

AJAX呼び出しが行われるごとにrefreshInterval(ミリ秒)。 timeoutプロパティは、1つのインターバルの間に得られる答えが、この間隔のデータであり、遅れている未応答のコールのデータではありません。

+0

ViewModelは動作しません.HTMLに返されません。 –

関連する問題