@@ -20,6 +20,12 @@ let AJAXCONF={
2020 requestInterceptor :function ( opt , req ) { return opt ; } ,
2121 responseInterceptor :function ( res , req ) { return res ; } ,
2222 successStatus :function ( status ) { return status === 200 ; } ,
23+ missingMockCallback ( option ) {
24+ //false: 缺失mock配置时,不使用mock,使用真实url请求
25+ return false ;
26+ //true: 缺失mock配置时,会error终止
27+ //return true;
28+ } ,
2329 baseUrl :"" ,
2430 mockCache :{ } ,
2531 mockMode :false ,
@@ -94,7 +100,7 @@ let ajax = {
94100 if ( this . isNull ( this . mockInstance ) ) {
95101 this . mockInstance = AJAXCONF . mockCache [ option . url ] ;
96102 if ( this . isNull ( this . mockInstance ) ) {
97- useMock = false ;
103+ useMock = AJAXCONF . missingMockCallback ( option ) ;
98104 }
99105 }
100106 }
@@ -130,21 +136,82 @@ let ajax = {
130136 * @param {Object } data,如{userId:3}
131137 * @return {String } 如 /user/3
132138 */
133- this . formatUrl = function ( url , data ) {
139+ this . formatUrl = function ( url , data , opt ) {
134140 if ( ! url ) return null ;
135141 var keys = url . match ( / \{ \w + \} / g) ;
136142 keys = ( keys === null ) ? [ ] : keys ;
137143 if ( keys ) {
138- keys . forEach ( function ( key ) {
139- var rawKey = key . substr ( 1 , key . length - 2 ) ;
140- var replace ;
141- if ( data === undefined || data === null || data [ rawKey ] === undefined || data [ rawKey ] === null ) {
142- replace = '' ;
143- } else {
144- replace = data [ rawKey ] ;
144+ if ( keys . length > 0 ) {
145+ keys . forEach ( function ( key ) {
146+ var rawKey = key . substr ( 1 , key . length - 2 ) ;
147+ var replace ;
148+ if ( data === undefined || data === null || data [ rawKey ] === undefined || data [ rawKey ] === null ) {
149+ replace = '' ;
150+ } else {
151+ replace = data [ rawKey ] ;
152+ }
153+ url = url . replace ( new RegExp ( key , 'g' ) , replace ) ;
154+ } ) ;
155+ }
156+ else {
157+ //url中不包含{}
158+ if ( opt . type . toLowerCase ( ) === "get" || opt . type . toLowerCase ( ) === "delete" ) {
159+ if ( data === undefined || data === null ) {
160+ return url ;
161+ } else {
162+ var newData = null ;
163+ if ( Object . prototype . toString . call ( data ) === '[object Array]' ) {
164+ newData = { } ;
165+ for ( var i = 0 ; i < data . length ; i ++ ) {
166+ newData [ i ] = data [ i ] ;
167+ }
168+ }
169+ else if ( Object . prototype . toString . call ( data ) === '[object Object]' ) {
170+ newData = data ;
171+ }
172+ if ( newData !== null ) {
173+ var firstUrl = url . indexOf ( "?" ) > - 1 ?url . substr ( 0 , url . indexOf ( "?" ) ) :url ;
174+ //有旧数据则合并
175+ if ( url . indexOf ( "?" ) > - 1 ) {
176+ var lastUrl = url . substr ( url . indexOf ( "?" ) + 1 ) ;
177+ var strs = lastUrl . trim ( ) == "" ?[ ] :lastUrl . split ( "&" ) ;
178+ var oldData = { }
179+ url = firstUrl + "?"
180+ var oldKeys = [ ] ;
181+ for ( var i = 0 ; i < strs . length ; i ++ ) {
182+ var key = strs [ i ] . split ( "=" ) [ 0 ] ;
183+ oldKeys . push ( key )
184+ if ( Object . keys ( newData ) . indexOf ( key ) < 0 ) {
185+ //将新数据合并到旧数据上
186+ url += key + "=" + ( strs [ i ] . split ( "=" ) . length > 1 ?strs [ i ] . split ( "=" ) [ 1 ] :"" ) + "&" ;
187+ }
188+ else {
189+ //将新数据合并到旧数据上
190+ url += key + "=" + encodeURIComponent ( newData [ key ] == null ?"" :newData [ key ] ) + "&" ;
191+ }
192+ }
193+ Object . keys ( newData ) . forEach ( key => {
194+ if ( oldKeys . indexOf ( key ) < 0 ) {
195+ url += key + "=" + encodeURIComponent ( newData [ key ] == null ?"" :newData [ key ] ) + "&" ;
196+ }
197+ } ) ;
198+ }
199+ else {
200+ url = firstUrl + "?"
201+ Object . keys ( newData ) . forEach ( key => {
202+ url += key + "=" + encodeURIComponent ( newData [ key ] == null ?"" :newData [ key ] ) + "&" ;
203+ } ) ;
204+ }
205+
206+ if ( url . endsWith ( "&" ) ) {
207+ url = url . substr ( 0 , url . length - 1 ) ;
208+ }
209+ }
210+ }
211+
145212 }
146- url = url . replace ( new RegExp ( key , 'g' ) , replace ) ;
147- } ) ;
213+ }
214+
148215 }
149216 return url ;
150217 } ;
@@ -183,7 +250,10 @@ let ajax = {
183250 return new Promise ( function ( resolve , reject ) {
184251 try {
185252 if ( instance == null ) {
186- reject ( "mock未定义" )
253+ if ( option . error ) {
254+ option . error . call ( scope , "mock未定义:" + option . url ) ;
255+ }
256+ reject ( "mock未定义:" + option . url )
187257 return ;
188258 }
189259 new Promise ( function ( res , rej ) {
@@ -242,7 +312,7 @@ let ajax = {
242312 return this . mock ( opt , scope ) ;
243313 }
244314 var request = this . createInstance ( ) ;
245- opt . url = this . formatUrl ( opt . url , opt . data ) ;
315+ opt . url = this . formatUrl ( opt . url , opt . data , opt ) ;
246316 if ( opt . baseUrl !== undefined && opt . baseUrl === false ) {
247317 request . open ( opt . type , opt . url , opt . async ) ;
248318 }
0 commit comments