@@ -28,13 +28,13 @@ define([
28
28
}
29
29
30
30
/**
31
- * Checks if provided module is registered after load.
31
+ * Checks if provided module is rejected during load.
32
32
*
33
33
* @param {Object } module - Module to be checked.
34
34
* @return {Boolean }
35
35
*/
36
- function isRegistered ( module ) {
37
- return registry [ module . id ] ;
36
+ function isRejected ( module ) {
37
+ return registry [ module . id ] && registry [ module . id ] . error ;
38
38
}
39
39
40
40
/**
@@ -48,7 +48,21 @@ define([
48
48
return false ;
49
49
}
50
50
51
- return module . depCount > _ . filter ( module . depMaps , isRegistered ) . length ;
51
+ return module . depCount > _ . filter ( module . depMaps , isRejected ) . length ;
52
+ }
53
+
54
+ /**
55
+ * Checks if provided module has errors.
56
+ *
57
+ * @param {Object } module - Module to be checked.
58
+ * @returns {Boolean }
59
+ */
60
+ function isError ( module ) {
61
+ if ( ! module . depCount ) {
62
+ return false ;
63
+ }
64
+
65
+ return _ . filter ( module . depMaps , isRejected ) . length > 0 ;
52
66
}
53
67
54
68
/**
@@ -60,6 +74,15 @@ define([
60
74
return _ . some ( registry , isPending ) ;
61
75
}
62
76
77
+ /**
78
+ * Checks if requirejs's registry object contains errors.
79
+ *
80
+ * @returns {Boolean }
81
+ */
82
+ function hasError ( ) {
83
+ return _ . some ( registry , isError ) ;
84
+ }
85
+
63
86
/**
64
87
* Checks if 'resolver' module is in ready
65
88
* state and that there are no pending modules.
@@ -79,6 +102,18 @@ define([
79
102
callback . handler . call ( callback . ctx ) ;
80
103
}
81
104
105
+ /**
106
+ * Throws error handler.
107
+ *
108
+ * @param {Object } callback
109
+ */
110
+ function throwError ( callback ) {
111
+
112
+ if ( callback . error ) {
113
+ callback . error . call ( callback . ctx ) ;
114
+ }
115
+ }
116
+
82
117
/**
83
118
* Sets 'resolver' module to a ready state
84
119
* and invokes pending callbacks.
@@ -89,6 +124,15 @@ define([
89
124
callbacks . splice ( 0 ) . forEach ( invoke ) ;
90
125
}
91
126
127
+ /**
128
+ * Reject error
129
+ */
130
+ function reject ( ) {
131
+ ready = true ;
132
+
133
+ callbacks . splice ( 0 ) . forEach ( throwError ) ;
134
+ }
135
+
92
136
/**
93
137
* Drops 'ready' flag and runs the update process.
94
138
*/
@@ -105,11 +149,13 @@ define([
105
149
* @param {Function } handler - 'Ready' event handler function.
106
150
* @param {Object } [ctx] - Optional context with which handler
107
151
* will be invoked.
152
+ * @param {Function } onError - error event handler
108
153
*/
109
- function subscribe ( handler , ctx ) {
154
+ function subscribe ( handler , ctx , onError ) {
110
155
var callback = {
111
156
handler : handler ,
112
- ctx : ctx
157
+ ctx : ctx ,
158
+ error : onError
113
159
} ;
114
160
115
161
if ( ! isSubscribed ( callback ) ) {
@@ -132,6 +178,8 @@ define([
132
178
update = _ . debounce ( function ( retry ) {
133
179
if ( ! hasPending ( ) ) {
134
180
retry ? update ( -- retry ) : resolve ( ) ;
181
+ } else if ( hasError ( ) ) {
182
+ retry ? update ( -- retry ) : reject ( ) ;
135
183
}
136
184
} , updateDelay ) ;
137
185
0 commit comments