@@ -93,6 +93,7 @@ const updateResourceUsage = createAction('UPDATE_RESOURCE_USAGE');
93
93
94
94
const addCallbackJob = createAction ( 'ADD_CALLBACK_JOB' ) ;
95
95
const removeCallbackJob = createAction ( 'REMOVE_CALLBACK_JOB' ) ;
96
+ const setCallbackJobOutdated = createAction ( 'CALLBACK_JOB_OUTDATED' ) ;
96
97
97
98
function unwrapIfNotMulti (
98
99
paths : any ,
@@ -333,8 +334,10 @@ function handleServerside(
333
334
config : any ,
334
335
payload : any ,
335
336
paths : any ,
336
- long ?: LongCallbackInfo ,
337
- additionalArgs ?: [ string , string ] [ ]
337
+ long : LongCallbackInfo | undefined ,
338
+ additionalArgs : [ string , string , boolean ?] [ ] | undefined ,
339
+ getState : any ,
340
+ output : string
338
341
) : Promise < CallbackResponse > {
339
342
if ( hooks . request_pre ) {
340
343
hooks . request_pre ( payload ) ;
@@ -346,6 +349,7 @@ function handleServerside(
346
349
let job : string ;
347
350
let runningOff : any ;
348
351
let progressDefault : any ;
352
+ let moreArgs = additionalArgs ;
349
353
350
354
const fetchCallback = ( ) => {
351
355
const headers = getCSRFHeader ( ) as any ;
@@ -365,8 +369,9 @@ function handleServerside(
365
369
addArg ( 'job' , job ) ;
366
370
}
367
371
368
- if ( additionalArgs ) {
369
- additionalArgs . forEach ( ( [ key , value ] ) => addArg ( key , value ) ) ;
372
+ if ( moreArgs ) {
373
+ moreArgs . forEach ( ( [ key , value ] ) => addArg ( key , value ) ) ;
374
+ moreArgs = moreArgs . filter ( ( [ _ , __ , single ] ) => ! single ) ;
370
375
}
371
376
372
377
return fetch (
@@ -383,6 +388,14 @@ function handleServerside(
383
388
const handleOutput = ( res : any ) => {
384
389
const { status} = res ;
385
390
391
+ if ( job ) {
392
+ const callbackJob = getState ( ) . callbackJobs [ job ] ;
393
+ if ( callbackJob ?. outdated ) {
394
+ dispatch ( removeCallbackJob ( { jobId : job } ) ) ;
395
+ return resolve ( { } ) ;
396
+ }
397
+ }
398
+
386
399
function recordProfile ( result : any ) {
387
400
if ( config . ui ) {
388
401
// Callback profiling - only relevant if we're showing the debug ui
@@ -462,7 +475,8 @@ function handleServerside(
462
475
jobId : data . job ,
463
476
cacheKey : data . cacheKey as string ,
464
477
cancelInputs : data . cancel ,
465
- progressDefault : data . progressDefault
478
+ progressDefault : data . progressDefault ,
479
+ output
466
480
} ;
467
481
dispatch ( addCallbackJob ( jobInfo ) ) ;
468
482
job = data . job ;
@@ -635,9 +649,19 @@ export function executeCallback(
635
649
let newHeaders : Record < string , string > | null = null ;
636
650
let lastError : any ;
637
651
638
- const additionalArgs : [ string , string ] [ ] = [ ] ;
652
+ const additionalArgs : [ string , string , boolean ?] [ ] = [ ] ;
653
+ console . log ( cb . callback . output , getState ( ) . callbackJobs ) ;
639
654
values ( getState ( ) . callbackJobs ) . forEach (
640
655
( job : CallbackJobPayload ) => {
656
+ if ( cb . callback . output === job . output ) {
657
+ // Terminate the old jobs that are not completed
658
+ // set as outdated for the callback promise to
659
+ // resolve and remove after.
660
+ additionalArgs . push ( [ 'oldJob' , job . jobId , true ] ) ;
661
+ dispatch (
662
+ setCallbackJobOutdated ( { jobId : job . jobId } )
663
+ ) ;
664
+ }
641
665
if ( ! job . cancelInputs ) {
642
666
return ;
643
667
}
@@ -667,7 +691,9 @@ export function executeCallback(
667
691
payload ,
668
692
paths ,
669
693
long ,
670
- additionalArgs . length ? additionalArgs : undefined
694
+ additionalArgs . length ? additionalArgs : undefined ,
695
+ getState ,
696
+ cb . callback . output
671
697
) ;
672
698
673
699
if ( newHeaders ) {
0 commit comments