在前端開發中,我們經常需要進行異步操作,如何處理異步操作的結果并不是一件非常容易的事情,而使用Promise技術可以很好的解決這個問題。Vue是一款現代化的漸進式JavaScript框架,所以Vue+Promise是一種非常常見的組合。在Vue框架中,Promise被集成在了Vue核心中,可以通過Vue.prototype訪問到。現在,我們來看一下如何使用Vue+Promise進行封裝。
Vue.prototype.$http = function(url, data, method = 'post') {
return new Promise((resolve, reject) =>{
// 創建xhr實例
let xhr = new XMLHttpRequest();
xhr.open(method, url, true);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
let res = xhr.response ? JSON.parse(xhr.response) : {}
resolve(res);
} else {
reject(xhr);
}
}
};
xhr.onerror = function(e) {
reject(e);
};
xhr.timeout = 60000; // 超時時間
xhr.ontimeout = function(e) {
reject(e);
};
xhr.setRequestHeader("Content-type", "application/json;charset=UTF-8");
xhr.send(JSON.stringify(data));
});
};
上面的代碼就是一個簡單的Vue+Promise封裝,可以方便地進行異步操作。在這個封裝中,我們為Vue.prototype添加了一個$http方法,用來發送網絡請求。該方法接受三個參數,url表示請求的地址,data表示請求攜帶的數據,method表示請求的方法,默認是post方法。最終該方法返回一個Promise實例,可以通過then、catch等方法實現異步操作。
在這個方法中我們創建了xhr實例,并設置了請求的url和method。同時通過設置xhr的readyStateChange事件,我們可以監聽xhr的狀態變化。在狀態變化為4的時候,我們還需要判斷http的狀態碼,如果是200,則認為請求成功,并將response解析為json格式。否則我們認為請求失敗,并將xhr對象返回。同時我們還對xhr的onerror和ontimeout事件進行了監聽,用來處理網絡請求在發生錯誤或超時的時候的情況。
通過這個簡單的Vue+Promise封裝,我們可以很方便地進行網絡請求,即使在出現異常情況的時候,也很容易捕獲到錯誤,使我們可以更好的處理異步操作。這也是Vue和Promise兩種技術結合的一個非常好的應用案例。