@@ -28,7 +28,8 @@ module.exports = function () {
2828 var currentStatus = "idle" ;
2929
3030 // while downloading
31- var blockingPromises ;
31+ var blockingPromises = 0 ;
32+ var blockingPromisesWaiting = [ ] ;
3233
3334 // The update info
3435 var currentUpdateApplyHandlers ;
@@ -218,29 +219,40 @@ module.exports = function () {
218219 return Promise . all ( results ) ;
219220 }
220221
222+ function unblock ( ) {
223+ if ( -- blockingPromises === 0 ) {
224+ setStatus ( "ready" ) . then ( function ( ) {
225+ if ( blockingPromises === 0 ) {
226+ var list = blockingPromisesWaiting ;
227+ blockingPromisesWaiting = [ ] ;
228+ for ( var i = 0 ; i < list . length ; i ++ ) {
229+ list [ i ] ( ) ;
230+ }
231+ }
232+ } ) ;
233+ }
234+ }
235+
221236 function trackBlockingPromise ( promise ) {
222237 switch ( currentStatus ) {
223238 case "ready" :
224239 setStatus ( "prepare" ) ;
225- blockingPromises . push ( promise ) ;
226- waitForBlockingPromises ( function ( ) {
227- return setStatus ( "ready" ) ;
228- } ) ;
229- return promise ;
240+ /* fallthrough */
230241 case "prepare" :
231- blockingPromises . push ( promise ) ;
242+ blockingPromises ++ ;
243+ promise . then ( unblock , unblock ) ;
232244 return promise ;
233245 default :
234246 return promise ;
235247 }
236248 }
237249
238250 function waitForBlockingPromises ( fn ) {
239- if ( blockingPromises . length === 0 ) return fn ( ) ;
240- var blocker = blockingPromises ;
241- blockingPromises = [ ] ;
242- return Promise . all ( blocker ) . then ( function ( ) {
243- return waitForBlockingPromises ( fn ) ;
251+ if ( blockingPromises === 0 ) return fn ( ) ;
252+ return new Promise ( function ( resolve ) {
253+ blockingPromisesWaiting . push ( function ( ) {
254+ resolve ( fn ( ) ) ;
255+ } ) ;
244256 } ) ;
245257 }
246258
@@ -261,7 +273,6 @@ module.exports = function () {
261273
262274 return setStatus ( "prepare" ) . then ( function ( ) {
263275 var updatedModules = [ ] ;
264- blockingPromises = [ ] ;
265276 currentUpdateApplyHandlers = [ ] ;
266277
267278 return Promise . all (
@@ -298,7 +309,11 @@ module.exports = function () {
298309 function hotApply ( options ) {
299310 if ( currentStatus !== "ready" ) {
300311 return Promise . resolve ( ) . then ( function ( ) {
301- throw new Error ( "apply() is only allowed in ready status" ) ;
312+ throw new Error (
313+ "apply() is only allowed in ready status (state: " +
314+ currentStatus +
315+ ")"
316+ ) ;
302317 } ) ;
303318 }
304319 return internalApply ( options ) ;
0 commit comments