2011-05-17 135 views
0

我開發了一個Web應用程序,它可以從Web服務(即在另一個域中)獲取用戶更新,我希望每10秒獲取一次更新。 爲了第一次調用服務,我動態地在頁面中插入一個腳本。該服務是JSONP。然後我想定義一個觸發器,它可以在10到10秒之間插入一個腳本來獲取更新。它是否正確?我可以這樣做,而不會影響網站上的用戶體驗嗎?我的意思是網站的性能......如果我可以進行異步調用並且當我得到結果時我會更新狀態,那將是非常棒的。有沒有更好的解決方案來訪問遠程服務。是否有一種使用觸發器動態重用相同腳本的有效方法?我對JavaScript很新。你能給我一個簡短的例子嗎?我如何定義一個調用遠程Web服務的觸發器? ...或者如果有更好的解決方案。javascript從服務中獲取狀態

非常感謝, 拉杜d

+0

儘管沒有得到廣泛的支持,WebSocket可以在服務器和客戶端之間建立一個'實時'連接,從而使您能夠立即向服務器發送數據。而且帶寬較少,因爲您沒有每10秒觸發一次請求。 – pimvdb 2011-05-17 07:25:21

回答

0

以下將動態創建腳本標記並在完成給定的呼叫後刪除它們(以及它所需的全局)。

您也可以使用CORS來允許除GET之外的請求,儘管您可能已經知道這在舊版瀏覽器中不受支持。

爲了避免競爭條件或慢速網絡期間的性能問題,您可以允許JSONP回調以遞歸方式調用該函數,從而僅在返回回調時才發出新的呼叫,儘管可選的setTimeout調用可確保存在至少有一個最小的延遲。

以下使用維基百科的API來獲取特定的頁面修訂及其用戶。

<script> 
var JSONP = function(global){ 
    // (C) WebReflection Essential - Mit Style (http://webreflection.blogspot.com/2011/02/all-you-need-for-jsonp.html) 
    // 202 bytes minified + gzipped via Google Closure Compiler 
    function JSONP(uri, callback) { 
     function JSONPResponse() { 
      try { delete global[src] } catch(e) { global[src] = null } 
      documentElement.removeChild(script); 
      callback.apply(this, arguments); 
     } 
     var 
      src = prefix + id++, 
      script = document.createElement("script") 
     ; 
     global[src] = JSONPResponse; 
     documentElement.insertBefore(
      script, 
      documentElement.lastChild 
     ).src = uri + "=" + src; 
    } 
    var 
     id = 0, 
     prefix = "__JSONP__", 
     document = global.document, 
     documentElement = document.documentElement 
    ; 
    return JSONP; 
}(this); 

// Be sure to include the callback parameter at the end 

function startAPI (start) { 
    start = start || new Date(); 
    var url = 'http://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=Main%20Page&rvprop=timestamp|user|comment|content&format=json&callback'; 
    var minimum = 10000; 
    function execute (str) { 
     alert(str); 
    } 
    JSONP(url, function (obj) { 
     for (var pageNo in obj.query.pages) { 
      var page = obj.query.pages[pageNo]; 
      var str = 'The user ' + page.revisions[0]['user'] + ' left the page with this code ' + page.revisions[0]['*']; 
      execute(str); 
      var elapsed = (new Date().getTime()) - start; 
      setTimeout(startAPI, (elapsed < minimum) ? (minimum - elapsed) : 0); 
      break; 
     } 
    }); 
} 
startAPI(); 
</script> 
0

我會利用JavaScript的setInterval方法

function getUpdate() { 
    //AJAX goes here 
} 

var myInterval = setInterval(getUpdate,10000); 

這樣你就只需要一次注入腳本標籤。

1

我建議在你的AJAX回調中,當你得到結果時,你需要安排一個計時器(window.setTimeout(ex, t)),以便再次調用你的更新腳本。

在AJAX回調中設置時間的原因是您不知道完成AJAX調用需要多長時間。通過這種方式,您可以確保在連續更新之間平穩延遲10秒。

關於性能,你必須檢查。這取決於數據量和處理類型(以及頁面的其他部分)......但您可以嘗試一下並檢查處理器的使用情況......