五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > 在 JavaScript 應(yīng)用程序中實(shí)現(xiàn)數(shù)據(jù)源協(xié)調(diào)

在 JavaScript 應(yīng)用程序中實(shí)現(xiàn)數(shù)據(jù)源協(xié)調(diào)

文章來源:365jz.com     點(diǎn)擊數(shù):546    更新時(shí)間:2009-01-07 22:26   參與評(píng)論

異步數(shù)據(jù)源中存在的問題就是:它們不是同步的。尤其是,通過 HTTP 協(xié)議請(qǐng)求傳遞的數(shù)據(jù)可能會(huì)遠(yuǎn)遠(yuǎn)晚于預(yù)期到達(dá),或者請(qǐng)求發(fā)生超時(shí),或者完全失敗。任何 tcp 層協(xié)議都具有不可靠性,但是 Ajax 應(yīng)用程序可能與多個(gè)服務(wù)器有數(shù)據(jù)依賴關(guān)系,而這些服務(wù)器將影響到整個(gè) Web 應(yīng)用程序。

  處理數(shù)據(jù)依賴關(guān)系并非 Ajax 應(yīng)用程序的特別之處。各種各樣的應(yīng)用程序都使用信號(hào)量、隊(duì)列、共享變量等在進(jìn)程中與狀態(tài)進(jìn)行通信;在本例中,進(jìn)程 通常指的是數(shù)據(jù)獲取請(qǐng)求。但是,Web 應(yīng)用程序中的超時(shí)和其他服務(wù)器或網(wǎng)絡(luò)問題多于大多數(shù)其他類別的應(yīng)用程序(尤其是與嚴(yán)格執(zhí)行本地運(yùn)行的應(yīng)用程序相比)。此外,在數(shù)據(jù)源(甚至同一數(shù)據(jù)源中的多個(gè)請(qǐng)求)中的時(shí)序變化方面,基于 Web 的應(yīng)用程序也要高于大多數(shù)其他類型的應(yīng)用程序,甚至要高于使用基于網(wǎng)絡(luò)的資源(如數(shù)據(jù)庫)的多數(shù)應(yīng)用程序。

  請(qǐng)求狀態(tài)和超時(shí)

  我們將遇到的大多數(shù)代碼示例都是關(guān)于異步 Ajax 使用 XMLHttpRequest() 檢查是否接收到 200 OK 狀態(tài)碼。我建議在檢查的內(nèi)容中添加一些其他可行的狀態(tài),以及一個(gè)用于表示完全超時(shí)的 “偽狀態(tài)”。我在近期的一篇 developerWorks 技巧 “使用會(huì)話狀態(tài)避免不必要的 Ajax 流量”(參見 參考資料 獲得文章鏈接)中,我提供了一個(gè)利用 304 狀態(tài)碼 的示例,該示例仍然是個(gè)不錯(cuò)的想法。

  適當(dāng)處理各種 HTTP 狀態(tài)碼是個(gè)不錯(cuò)的想法。針對(duì) 2xx 狀態(tài)碼(而不是 200 OK)的操作仍然有點(diǎn)懸而未決:比如說,如果應(yīng)用程序?qū)?chuàng)建一個(gè)服務(wù)器資源,那么您可能希望檢查 201 Created 狀態(tài)碼并查看響應(yīng)中的 URI。標(biāo)準(zhǔn)情況下,客戶機(jī)必須 透明的重定向狀態(tài)碼 301、302、303 和 307。因此,我們實(shí)際上不必?fù)?dān)心它們,因?yàn)樗鼈冏罱K將得到 200 狀態(tài)(或者是超時(shí)、4xx 和 5xx 狀態(tài))。區(qū)別處理 4xx 錯(cuò)誤和 5xx 錯(cuò)誤可能是一個(gè)很好的方法。概括地說,4xx 狀態(tài)碼(尤其是常見的 404 Not Found 錯(cuò)誤)可能表示客戶機(jī)所使用 URL 中存在一些問題。5xx 錯(cuò)誤表示服務(wù)器存在問題,通常只需等待一段時(shí)間并重試便可解決該問題。

  與處理各種服務(wù)器錯(cuò)誤同樣重要的情況是,有時(shí)服務(wù)器會(huì)無限期掛起,而根本不會(huì)返回任何響應(yīng)。掛起實(shí)質(zhì)上等同于 5xx 狀態(tài)碼,不同之處就是我們無法檢查 XMLHttpRequest().status 狀態(tài)碼來識(shí)別它們。為此,我們可以使用一個(gè) setTimeout() 計(jì)時(shí)器來取消超時(shí)請(qǐng)求。

  將相關(guān)檢查結(jié)合在一起,我們的 Ajax 數(shù)據(jù)源請(qǐng)求可能類似于清單 1:

清單 1. 數(shù)據(jù)源請(qǐng)求的健壯處理

function getResource(uri, data_callback, error_callback, timeout) {
  var tryAgain = function () {
   getResource(uri, data_callback, error_callback, timeout);
  }
  var r = new XMLHttpRequest();
  var timer = setTimeout(
    function() {
      r.abort();
      r.onreadystatechange = null;
      setTimeout(tryAgain, timeout);
    },
    timeout);
  r.open("GET", uri, true);
  r.onreadystatechange = function() {
    if (r.readyState != 4) {
      // Ignore non-loaded readyStates
      // ...will timeout if do not get to "Loaded"
      return;
    }
    clearTimeout(timer); // readyState==4, no more timer
    if (r.status==200) { // "OK status"
       data_callback(r.responseText);
    }
    else if (r.status==304) {
      // "Not Modified": No change to display
    }
    else if (r.status >= 400 && r.status < 500) {
      // Client error, probably bad URI
      error_callback(r)
    }
    else if (r.status >= 500 && r.status < 600) {
      // server error, try again after delay
      setTimeout(tryAgain, timeout);
    }
    else {
      error_callback(r);
    }
  }
  r.send(null);
  return r;
}

 

  當(dāng)然,我們可以在 getResource() 中加入各種增強(qiáng)。比如說,在超時(shí)或服務(wù)器錯(cuò)誤狀態(tài)事件中,我們可以在延時(shí)之后調(diào)用 tryAgain()。或者,我們可能希望在這兩種情況下使用一些其他的回調(diào)。傳遞的 error_callback() 函數(shù)將用于下面這種情況,即不希望再次發(fā)送重復(fù)請(qǐng)求,但是常常會(huì)發(fā)生這種情況。

  數(shù)據(jù)協(xié)調(diào)

  給出的 getResource() 函數(shù)可能會(huì)無限制地等待,獲取數(shù)據(jù)源并將其提供給 data_callback()。但是,該數(shù)據(jù)回調(diào)自己可能需要依賴其他數(shù)據(jù)的可用性。同時(shí)操作多個(gè)數(shù)據(jù)源的最簡單方法就是將它們的內(nèi)容存儲(chǔ)在一個(gè)全局變量中,并當(dāng)該數(shù)據(jù)被使用時(shí)清空這些變量。比如說,基本的回調(diào)方法可能類似于清單 2:

清單 2. 兩個(gè)源的基本數(shù)據(jù)回調(diào)

var other_data = null;
function processOtherData(responseText) {
  other_data = responseText;
}
function processData(this_data) {
  var delay = 1000;   // Keep trying at 1-second intervals
  if (other_data == null) {
    setTimeout(function() { processData(this_data); }, delay);
    return;
  }
  // We have both this_data and other_data
  displayThisAndThat(this_data, other_data);
  // Reset other_data now that we have consumed it
  other_data = null;
}

 

  應(yīng)用程序?qū)⒄{(diào)用 getResource(uri1,processOtherData,...) 方法,然后將在別處調(diào)用 getResource(uri2,processData,...) 方法。后面這個(gè)調(diào)用將運(yùn)行一個(gè)回調(diào)從內(nèi)部 “輪詢” other_data 直到它實(shí)際填入了數(shù)據(jù),并在該數(shù)據(jù)被處理后將它清空。另一個(gè)信號(hào)量可能與以下操作相關(guān),避免重復(fù)后面這個(gè)調(diào)用,直到第一次嘗試成功并且/或針對(duì)延時(shí)的 processData() 調(diào)用 clearTimeout(),有利于更新的請(qǐng)求。

  結(jié)束語

  數(shù)據(jù)協(xié)調(diào)的具體應(yīng)用在任何種類的應(yīng)用程序中的復(fù)雜度都會(huì)有所不同 — 而不僅僅是 Ajax 應(yīng)用程序。本文所提供的示例只使用一個(gè)主數(shù)據(jù)表示函數(shù) processData() 和一個(gè)有用的回調(diào)來獲取額外的數(shù)據(jù),即 processOtherData()。但是,這種模式非常容易應(yīng)用到廣泛的相互依存的數(shù)據(jù)源。

  在任何情況下,getResource() 函數(shù)都是一個(gè)很好的通用框架,它可用于解決在 HTTP 上獲取數(shù)據(jù)時(shí)遇到的問題。通常,該訪問最終都會(huì)成功,前提是在表達(dá)請(qǐng)求時(shí)沒有發(fā)生客戶端錯(cuò)誤。也就是說,短暫的網(wǎng)絡(luò)和服務(wù)器錯(cuò)誤只意味著延時(shí),而不是故障。當(dāng)然,在 Ajax 應(yīng)用程序中,我們需要使用一些特別的技巧來從多個(gè)域中獲取數(shù)據(jù)。其方法通常是將 XMLHttpRequest() 對(duì)象放置在單獨(dú)隱藏的 IFrames 中以輪詢不同的域,不過這對(duì)異步協(xié)調(diào)毫無特別之處

本文作者:未知

如對(duì)本文有疑問,請(qǐng)?zhí)峤坏浇涣髡搲瑥V大熱心網(wǎng)友會(huì)為你解答??! 點(diǎn)擊進(jìn)入論壇

發(fā)表評(píng)論 (546人查看,0條評(píng)論)
請(qǐng)自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
昵稱:
最新評(píng)論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時(shí)間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號(hào)