[問八系列] Windows 8 開發 (5): 分離檢視型應用程式 Part 2: 了解 Windows 8 中的 XML HTTP 與非同步

在 Part 1 中,我們已經製作好部落格的清單,接下來我們想做的是由那些部落格中抓取他們的 RSS 來列出清單,為了要達到這個需求,我們需要利用 XML HTTP 抓取資料,不過因為會處理到非同步,而且我們也不想在資料還沒抓完前就做下一個動作吧,那會造成 synchronous 的問題,所以我們要有一些方法來處理,我們會用到兩個在 WinJS 中的功能:xhr 和 Promise 物件。

在 Part 1 中,我們已經製作好部落格的清單,接下來我們想做的是由那些部落格中抓取他們的 RSS 來列出清單,為了要達到這個需求,我們需要利用 XML HTTP 抓取資料,不過因為會處理到非同步,而且我們也不想在資料還沒抓完前就做下一個動作吧,那會造成 synchronous 的問題,所以我們要有一些方法來處理,我們會用到兩個在 WinJS 中的功能:xhr 和 Promise 物件。

xhr 是 XML HTTP 物件的包裝,放在 WinJS 命名空間內,呼叫方法很簡單:

WinJS.xhr({ url: "http://www.microsoft.com" });

它會回傳一個叫做 WinJS.Promise 的物件,這個物件主要是處理非同步的作業,它開放了幾個方法給開發人員做後面的處理工作,其中最常用的兩個方法是 then() 和 done(),done() 最容易了解,它是在 Promise 動作完成時才呼叫,而 then() 是在非同步的狀態變更時就會被呼叫,簡單的說,執行的順序會是先 then() 再 done(),當然也可以兩個都使用,但順序基本上要是 then(…).done(…)。它們兩個都同時擁有三個參數 onComplete, onError 和 onProgress,但就像前面所說的,then() 是處理非同步狀態變更時,而 done() 是整個動作完成後,所以如果 then() 中擲出了例外,done() 會呼叫 onError 的處理常式來處理例外。

所以我們可以利用下面這樣的指令來抓取 RSS:

WinJS.xhr({ url: "http://www.dotblogs.com.tw/regionbbs/rss.aspx" }).done(function (r) {
    var response = r.responseXML;
    var items = response.selectNodes("//rss/channel/item");

    for (var i = 0; i < items.length; i++) {

        $("#data > ul").append($("<li />").text(items[i].selectSingleNode("title").text));

    }
});

它會將資料寫入到 data 容器內的 ul 元素內。

image

 

有了這個基礎後,我們就可以回到修改 Part 1  的程式的工作了。

(To Be Continued…)

 

Reference:

 

http://msdn.microsoft.com/en-us/library/windows/apps/hh868282.aspx

http://msdn.microsoft.com/en-us/library/windows/apps/br211867.aspx