@@ -5,10 +5,10 @@ import trace from "../common/trace";
5
5
6
6
import { ITransitionOptions , ITransitionHookOptions , ITreeChanges , IHookRegistry , IHookRegistration , IHookGetter } from "./interface" ;
7
7
import $transitions from "./transitionService" ;
8
+ import TransitionHook from "./transitionHook" ;
8
9
import { HookRegistry , matchState } from "./hookRegistry" ;
9
10
import HookBuilder from "./hookBuilder" ;
10
- import TransitionRunner from "./transitionRunner" ;
11
- import { RejectFactory } from "./rejectFactory" ;
11
+ import { RejectFactory , TransitionRejection } from "./rejectFactory" ;
12
12
13
13
import Node from "../path/node" ;
14
14
import PathFactory from "../path/pathFactory" ;
@@ -27,7 +27,8 @@ import {ViewConfig} from "../view/view";
27
27
28
28
import {
29
29
map , find , extend , filter , mergeR , flatten , unnest , tail , forEach , identity ,
30
- omit , isObject , not , prop , propEq , toJson , val , abstractKey , arrayTuples , allTrueR
30
+ omit , isObject , isPromise , not , prop , propEq , toJson , val , abstractKey ,
31
+ arrayTuples , allTrueR , Predicate
31
32
} from "../common/common" ;
32
33
33
34
let transitionCount = 0 , REJECT = new RejectFactory ( ) ;
@@ -164,7 +165,7 @@ export class Transition implements IHookRegistry {
164
165
* @param state (optional) the state in the topath which should receive the new resolves (otherwise, the root state)
165
166
*/
166
167
addResolves ( resolves : IResolveDeclarations , state : IStateOrName = "" ) {
167
- let stateName = state . name ? state . name : state ;
168
+ let stateName = < string > ( < any > state ) . name ? ( < any > state ) . name : state ;
168
169
let topath = this . _treeChanges . to ;
169
170
let targetNode = find ( topath , node => node . state . name === stateName ) ;
170
171
tail ( topath ) . resolveContext . addResolvables ( Resolvable . makeResolvables ( resolves ) , targetNode . state ) ;
@@ -309,14 +310,26 @@ export class Transition implements IHookRegistry {
309
310
}
310
311
311
312
run ( ) {
313
+ let hookBuilder = this . hookBuilder ( ) ;
314
+ let runSynchronousHooks = TransitionHook . runSynchronousHooks ;
315
+ const runSuccessHooks = ( ) => runSynchronousHooks ( hookBuilder . getOnSuccessHooks ( ) , { } , true ) ;
316
+ const runErrorHooks = ( $error$ ) => runSynchronousHooks ( hookBuilder . getOnErrorHooks ( ) , { $error$ } , true ) ;
317
+ // Run the success/error hooks *after* the Transition promise is settled.
318
+ this . promise . then ( runSuccessHooks , runErrorHooks ) ;
319
+
320
+ let promiseChain = runSynchronousHooks ( hookBuilder . getOnBeforeHooks ( ) ) ;
321
+
322
+ if ( TransitionHook . isRejection ( promiseChain ) ) {
323
+ this . _deferred . reject ( promiseChain ) ;
324
+ return this . promise ;
325
+ }
326
+
312
327
if ( ! this . valid ( ) ) {
313
328
let error = new Error ( this . error ( ) ) ;
314
329
this . _deferred . reject ( error ) ;
315
- throw error ;
330
+ return this . promise ;
316
331
}
317
332
318
- trace . traceTransitionStart ( this ) ;
319
-
320
333
if ( this . ignored ( ) ) {
321
334
trace . traceTransitionIgnored ( this ) ;
322
335
let ignored = REJECT . ignored ( ) ;
@@ -336,7 +349,10 @@ export class Transition implements IHookRegistry {
336
349
return runtime . $q . reject ( error ) ;
337
350
} ;
338
351
339
- new TransitionRunner ( this , resolve , reject ) . run ( ) ;
352
+ trace . traceTransitionStart ( this ) ;
353
+
354
+ promiseChain = hookBuilder . asyncHooks ( ) . reduce ( ( _chain , step ) => _chain . then ( step . invokeStep ) , promiseChain ) ;
355
+ promiseChain . then ( resolve , reject ) ;
340
356
341
357
return this . promise ;
342
358
}
0 commit comments