⽹頁應⽤主要數據源有兩個:⼀個是⽹頁中的DOM事件,另⼀個就是經過AJAX得到的服務器資源。咱們已經知道fromEvent這個操做符能夠根據DOM事件產⽣Observable對象,相應的,RxJS還提供了另⼀個名爲ajax的操做符,根據AJAX請求的返回結果產⽣Observable對象,當處理複雜的邏輯時,經過操做符組合實現數據流處理才能彰顯威⼒,如今接觸的仍是建立類操做符,當接觸到其餘類型的操做符以後,會看到ajax的巧妙⽤法。
註釋:下代碼爲react項目中ajax進行基礎配置的封裝react
import { ajax} from 'rxjs/ajax'; function ajaxJson(type, url, data){ let localHost = window.location.host; if (window.location.port) { localHost = localHost.split(':')[0]; } let URL = '//api.' + localHost + ':80/v1/'+url; let config = { url:URL, method:type, withCredentials: true, headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }; if(type ==='post'){ config['body'] = JSON.stringify(data); } else if(type === 'get'){ let ret = '?'; for (let it in data) { ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'; } ret=ret.substring(0,ret.length-1); config.url +=ret; } return ajax(config); } export { ajaxJson }
import {ajaxJson} from '../../tools/ajax.js'; //... let data= { page:1, pageSize:10, search:'' }; //請求錯誤處理函數,可放在tools 文件中 function errorData(err){ if(err.code ===404){ return '接口訪問錯誤,請聯繫相關開發人員。' } if(err.response ===null || err.response ==='' || err.response.length > 50){ return '網絡錯誤。' } return err.response; } //請求前的啓動加載效果函數 async function asyncLoading(){ return new Promise((resolve,reject)=>{ that.setState({ loading:true //數據加載效果開啓 },()=>{resolve('1')}) }) } //獲取接口數據函數 async function fetchData(){ await asyncLoading(); await ajaxJson('get','source/combineSourceList',data).pipe( retry(1), //重試 // catchError(err=>of({response:[]})), //修復 map(data=>data.response), ) .subscribe({ next:(data)=>{this.setState({ data:data, loading:false, //數據加載效果結束 })}, error:(err)=>{ message.error(errorData(err)); this.setState({ loading:false, //數據加載效果結束 }) }, complete:()=>{ console.log('complete') } }); }; fetchData.call(this); //...