@@ -76,6 +76,11 @@ export default class RunestoneBase {
7676
7777 }
7878 this . mjelements = [ ] ;
79+ let self = this ;
80+ this . mjReady = new Promise ( function ( resolve , reject ) {
81+ self . mjresolver = resolve ;
82+ } ) ;
83+ this . aQueue = new AutoQueue ( ) ;
7984 this . jsonHeaders = new Headers ( {
8085 "Content-type" : "application/json; charset=utf-8" ,
8186 Accept : "application/json" ,
@@ -134,8 +139,7 @@ export default class RunestoneBase {
134139 async postLogMessage ( eventInfo ) {
135140 var post_return ;
136141 let request = new Request (
137- `${ eBookConfig . new_server_prefix } /logger/bookevent` ,
138- {
142+ `${ eBookConfig . new_server_prefix } /logger/bookevent` , {
139143 method : "POST" ,
140144 headers : this . jsonHeaders ,
141145 body : JSON . stringify ( eventInfo ) ,
@@ -198,8 +202,7 @@ export default class RunestoneBase {
198202 eBookConfig . logLevel > 0
199203 ) {
200204 let request = new Request (
201- `${ eBookConfig . new_server_prefix } /logger/runlog` ,
202- {
205+ `${ eBookConfig . new_server_prefix } /logger/runlog` , {
203206 method : "POST" ,
204207 headers : this . jsonHeaders ,
205208 body : JSON . stringify ( eventInfo ) ,
@@ -248,7 +251,7 @@ export default class RunestoneBase {
248251 ) {
249252 // Check if the server has stored answer
250253 let self = this ;
251- this . checkServerComplete = new Promise ( function ( resolve , reject ) {
254+ this . checkServerComplete = new Promise ( function ( resolve , reject ) {
252255 self . csresolver = resolve ;
253256 } ) ;
254257 if (
@@ -280,8 +283,7 @@ export default class RunestoneBase {
280283 this . assessmentTaken
281284 ) {
282285 let request = new Request (
283- `${ eBookConfig . new_server_prefix } /assessment/results` ,
284- {
286+ `${ eBookConfig . new_server_prefix } /assessment/results` , {
285287 method : "POST" ,
286288 body : JSON . stringify ( data ) ,
287289 headers : this . jsonHeaders ,
@@ -456,13 +458,14 @@ export default class RunestoneBase {
456458 // should wait until defaultPageReady is defined
457459 // If defaultPageReady is not defined then just enqueue the components.
458460 // Once defaultPageReady is defined
459- if ( MathJax . startup && MathJax . startup . defaultPageReady ) {
460- return MathJax . startup . defaultPageReady ( ) . then (
461- async function ( ) {
462- console . log ( `MathJax Ready -- promising a typesetting run for ${ component . id } ` )
463- return await MathJax . typesetPromise ( [ component ] )
464- }
465- ) ;
461+ if ( MathJax . typesetPromise ) {
462+ return this . mjresolver ( this . aQueue . enqueue ( component ) )
463+ } else {
464+ console . log ( `Waiting on MathJax!! ${ MathJax . typesetPromise } ` ) ;
465+ console . log ( `Runestone Math: ${ runestoneMathReady } ` )
466+ setTimeout ( ( ) => this . queueMathJax ( component ) , 200 ) ;
467+ console . log ( `Returning mjready promise: ${ this . mjReady } ` )
468+ return this . mjReady ;
466469 }
467470 }
468471 }
@@ -476,49 +479,54 @@ export default class RunestoneBase {
476479// once mathjax becomes ready then we can drain the queue and continue as usual.
477480
478481class Queue {
479- constructor ( ) { this . _items = [ ] ; }
480- enqueue ( item ) { this . _items . push ( item ) ; }
481- dequeue ( ) { return this . _items . shift ( ) ; }
482- get size ( ) { return this . _items . length ; }
482+ constructor ( ) { this . _items = [ ] ; }
483+ enqueue ( item ) { this . _items . push ( item ) ; }
484+ dequeue ( ) { return this . _items . shift ( ) ; }
485+ get size ( ) { return this . _items . length ; }
483486}
484487
485488class AutoQueue extends Queue {
486- constructor ( ) {
487- super ( ) ;
488- this . _pendingPromise = false ;
489- }
489+ constructor ( ) {
490+ super ( ) ;
491+ this . _pendingPromise = false ;
492+ }
493+
494+ enqueue ( component ) {
495+ return new Promise ( ( resolve , reject ) => {
496+ super . enqueue ( { component, resolve, reject } ) ;
497+ this . dequeue ( ) ;
498+ } ) ;
499+ }
490500
491- enqueue ( action ) {
492- return new Promise ( ( resolve , reject ) => {
493- super . enqueue ( { action, resolve, reject } ) ;
494- this . dequeue ( ) ;
495- } ) ;
496- }
501+ async dequeue ( ) {
502+ if ( this . _pendingPromise ) return false ;
497503
498- async dequeue ( ) {
499- if ( this . _pendingPromise ) return false ;
504+ let item = super . dequeue ( ) ;
500505
501- let item = super . dequeue ( ) ;
506+ if ( ! item ) return false ;
502507
503- if ( ! item ) return false ;
508+ try {
509+ this . _pendingPromise = true ;
504510
505- try {
506- this . _pendingPromise = true ;
511+ let payload = await MathJax . startup . defaultPageReady ( ) . then (
512+ async function ( ) {
513+ console . log ( `MathJax Ready -- dequeing a typesetting run for ${ item . component . id } ` )
514+ return await MathJax . typesetPromise ( [ item . component ] )
515+ }
516+ ) ;
507517
508- let payload = await item . action ( this ) ;
518+ this . _pendingPromise = false ; item . resolve ( payload ) ;
519+ }
520+ catch ( e ) {
521+ this . _pendingPromise = false ;
522+ item . reject ( e ) ;
523+ } finally {
524+ this . dequeue ( ) ;
525+ }
509526
510- this . _pendingPromise = false ;
511- item . resolve ( payload ) ;
512- } catch ( e ) {
513- this . _pendingPromise = false ;
514- item . reject ( e ) ;
515- } finally {
516- this . dequeue ( ) ;
527+ return true ;
528+ }
517529 }
518530
519- return true ;
520- }
521- }
522-
523531
524- window . RunestoneBase = RunestoneBase ;
532+ window . RunestoneBase = RunestoneBase ;
0 commit comments