@@ -3,37 +3,77 @@ import hoistStatics from 'hoist-non-react-statics'
33import { isDefined , newScript , series , noop } from './utils'
44
55const loadedScript = [ ]
6+ const pendingScripts = { }
67let failedScript = [ ]
78
8- const scriptLoader = ( ...scripts ) => ( WrappedComponent ) => {
9+ export function startLoadingScripts ( scripts , onComplete = noop ) {
10+ // sequence load
11+ const loadNewScript = ( src ) => {
12+ if ( loadedScript . indexOf ( src ) < 0 ) {
13+ return taskComplete => {
14+ const callbacks = pendingScripts [ src ] || [ ]
15+ callbacks . push ( taskComplete )
16+ pendingScripts [ src ] = callbacks
17+ if ( callbacks . length === 1 ) {
18+ return newScript ( src ) ( err => {
19+ pendingScripts [ src ] . forEach ( cb => cb ( err , src ) )
20+ delete pendingScripts [ src ]
21+ } )
22+ }
23+ }
24+ }
25+ }
26+ const tasks = scripts . map ( src => {
27+ if ( Array . isArray ( src ) ) {
28+ return src . map ( loadNewScript )
29+ }
30+ else return loadNewScript ( src )
31+ } )
932
10- const addCache = ( entry ) => {
11- if ( loadedScript . indexOf ( entry ) < 0 ) {
12- loadedScript . push ( entry )
33+ series ( ...tasks ) ( ( err , src ) => {
34+ if ( err ) {
35+ failedScript . push ( src )
36+ }
37+ else {
38+ if ( Array . isArray ( src ) ) {
39+ src . forEach ( addCache )
40+ }
41+ else addCache ( src )
1342 }
43+ } ) ( err => {
44+ removeFailedScript ( )
45+ onComplete ( err )
46+ } )
47+ }
48+
49+ const addCache = ( entry ) => {
50+ if ( loadedScript . indexOf ( entry ) < 0 ) {
51+ loadedScript . push ( entry )
1452 }
53+ }
1554
16- const removeFailedScript = ( ) => {
17- if ( failedScript . length > 0 ) {
18- failedScript . forEach ( ( script ) => {
19- const node = document . querySelector ( `script[src='${ script } ']` )
20- if ( node != null ) {
21- node . parentNode . removeChild ( node )
22- }
23- } )
55+ const removeFailedScript = ( ) => {
56+ if ( failedScript . length > 0 ) {
57+ failedScript . forEach ( ( script ) => {
58+ const node = document . querySelector ( `script[src='${ script } ']` )
59+ if ( node != null ) {
60+ node . parentNode . removeChild ( node )
61+ }
62+ } )
2463
25- failedScript = [ ]
26- }
64+ failedScript = [ ]
2765 }
66+ }
2867
68+ const scriptLoader = ( ...scripts ) => ( WrappedComponent ) => {
2969 class ScriptLoader extends Component {
3070 static propTypes = {
3171 onScriptLoaded : T . func
32- } ;
72+ }
3373
3474 static defaultProps = {
3575 onScriptLoaded : noop
36- } ;
76+ }
3777
3878 constructor ( props , context ) {
3979 super ( props , context )
@@ -45,30 +85,7 @@ const scriptLoader = (...scripts) => (WrappedComponent) => {
4585 }
4686
4787 componentDidMount ( ) {
48- // sequence load
49- const loadNewScript = ( src ) => {
50- if ( loadedScript . indexOf ( src ) < 0 ) return newScript ( src )
51- }
52- const tasks = scripts . map ( src => {
53- if ( Array . isArray ( src ) ) {
54- return src . map ( loadNewScript )
55- }
56- else return loadNewScript ( src )
57- } )
58-
59- series ( ...tasks ) ( ( err , src ) => {
60- if ( err ) {
61- failedScript . push ( src )
62- }
63- else {
64- if ( Array . isArray ( src ) ) {
65- src . forEach ( addCache )
66- }
67- else addCache ( src )
68- }
69- } ) ( err => {
70- removeFailedScript ( )
71-
88+ startLoadingScripts ( scripts , err => {
7289 this . setState ( {
7390 isScriptLoaded : true ,
7491 isScriptLoadSucceed : ! err
0 commit comments