11import { RootState } from '../../data/reducers' ;
22import { ProviderSourceConfig , runTimeType } from '../../types' ;
33import { containerActionCreators } from '../Container/action' ;
4- import { isEqual , isPlainObject , remove , isEmpty , get , has } from 'lodash' ;
4+ import { isEqual , isPlainObject , isEmpty , get , has } from 'lodash' ;
55import { ContainerProps } from '../Container/Container' ;
66import { RunTimeContextCollection } from '../context' ;
77import { getRuntimeContext , isPromise } from '../util/util' ;
@@ -179,7 +179,8 @@ export class DataProvider {
179179 }
180180
181181 public computeRequestGroup ( providerList : ProviderSourceConfig [ ] ) {
182- let taskQueue = [ ] ;
182+ let roads : string [ ] = [ ] ;
183+ let taskQueue : string [ ] [ ] = [ ] ;
183184
184185 for ( let i = 0 ; i < providerList . length ; i ++ ) {
185186 let provider = providerList [ i ] ;
@@ -195,52 +196,50 @@ export class DataProvider {
195196
196197 if ( requiredParams . length === 0 && provider . namespace ) {
197198 let key = provider . namespace ;
198-
199- let queue = [ key ] ;
200199 let paths = { } ;
201- this . getRequestTaskQueue ( key , this . dependencies [ key ] . beDep , queue , paths ) ;
202- taskQueue . push ( queue ) ;
200+ this . getRequestTaskQueue ( key , this . dependencies [ key ] . beDep , key , paths , roads ) ;
203201 }
204202 }
205203
206- this . taskQueue = taskQueue ;
207- }
204+ roads . sort ( ( prev , next ) => {
205+ return next . split ( '->' ) . length - prev . split ( '->' ) . length ;
206+ } ) ;
208207
209- public getRequestTaskQueue ( from : string , deps : string [ ] , taskQueue : string [ ] , paths : { [ key : string ] : boolean } ) {
210- if ( deps . length === 0 ) {
211- return ;
212- }
208+ let activeStep = { } ;
209+ for ( let road of roads ) {
210+ let step = road . split ( '->' ) ;
213211
214- deps = deps . slice ( ) ;
215- while ( deps . length > 0 ) {
216- let nextProvider = deps . shift ( ) ;
212+ for ( let i = 0 ; i < step . length ; i ++ ) {
213+ if ( ! taskQueue [ i ] ) {
214+ taskQueue [ i ] = [ ] ;
215+ }
217216
218- if ( ! nextProvider ) {
219- break ;
217+ if ( ! taskQueue [ i ] . includes ( step [ i ] ) && ! activeStep [ step [ i ] ] ) {
218+ activeStep [ step [ i ] ] = true ;
219+ taskQueue [ i ] . push ( step [ i ] ) ;
220+ }
220221 }
222+ }
221223
222- let dep = this . dependencies [ nextProvider ] . dep ;
223-
224- remove ( dep , d => d === from ) ;
224+ this . taskQueue = taskQueue ;
225+ }
225226
226- if ( dep . length > 0 ) {
227- continue ;
228- }
227+ public getRequestTaskQueue ( key : string , deps : string [ ] , road : string , paths : { [ key : string ] : boolean } , roads : string [ ] ) {
228+ if ( deps . length === 0 ) {
229+ roads . push ( road ) ;
230+ return ;
231+ }
229232
230- if ( paths [ nextProvider ] ) {
231- let f = this . dependencies [ nextProvider ] . beDep . join ( ', ') ;
233+ for ( let nextProvider of deps ) {
234+ let existPaths = road . split ( '-> ') ;
232235
233- console . error ( `DataProvider: 发现循环依赖的dataProvider. ${ f } <--> ${ nextProvider } ;` ) ;
234- console . log ( this . dependencies ) ;
235- continue ;
236+ if ( existPaths . includes ( nextProvider ) ) {
237+ throw new Error ( `DataProvider: 发现循环依赖的dataProvider. ${ road + '->' + nextProvider } ` ) ;
236238 }
237239
238- if ( ! taskQueue . includes ( nextProvider ) ) {
239- taskQueue . push ( nextProvider ) ;
240- paths [ nextProvider ] = true ;
241- }
240+ let nextRoad = road + '->' + nextProvider ;
242241
243- this . getRequestTaskQueue ( nextProvider , this . dependencies [ nextProvider ] . dep , taskQueue , paths ) ;
242+ this . getRequestTaskQueue ( nextProvider , this . dependencies [ nextProvider ] . beDep , nextRoad , paths , roads ) ;
244243 }
245244 }
246245
@@ -508,34 +507,9 @@ export class DataProvider {
508507 ) {
509508 let runTime = this . getRunTime ( model , props , context ) ;
510509 let retCache = { } ;
511-
512- let execTask : string [ ] [ ] = [ ] ;
513- let execIndex = 0 ;
514- let maxQueueSize = 1 ;
510+ let execTask = this . taskQueue ;
515511 let isProgress = false ;
516512
517- // 生成请求队列
518- while ( execIndex < maxQueueSize ) {
519- for ( let i = 0 ; i < this . taskQueue . length ; i ++ ) {
520- let task = this . taskQueue [ i ] ;
521-
522- if ( task . length > maxQueueSize ) {
523- maxQueueSize = task . length ;
524- }
525-
526- if ( ! execTask [ execIndex ] ) {
527- execTask [ execIndex ] = [ ] ;
528- }
529-
530- let exec = task [ execIndex ] ;
531- if ( exec ) {
532- execTask [ execIndex ] . push ( exec ) ;
533- }
534- }
535-
536- execIndex ++ ;
537- }
538-
539513 // 并发发送请求
540514 for ( let i = 0 ; i < execTask . length ; i ++ ) {
541515 let state : RootState = context . rcre . store . getState ( ) ;
0 commit comments