Skip to content

Commit 9143d57

Browse files
committed
fix issue jakesgordon#106 - forward resolved async value to end of lifecycle
1 parent c1bf918 commit 9143d57

3 files changed

Lines changed: 15 additions & 13 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
node_modules
22
coverage
33
.nyc_output
4+
*.swp

src/jsm.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,9 @@ mixin(JSM.prototype, {
131131
return [ event, result, true ]
132132
},
133133

134-
observeEvents: function(events, args, previousEvent) {
134+
observeEvents: function(events, args, previousEvent, previousResult) {
135135
if (events.length === 0) {
136-
return this.endTransit(true);
136+
return this.endTransit(previousResult === undefined ? true : previousResult);
137137
}
138138

139139
var event = events[0][0],
@@ -146,7 +146,7 @@ mixin(JSM.prototype, {
146146

147147
if (observers.length === 0) {
148148
events.shift();
149-
return this.observeEvents(events, args, event);
149+
return this.observeEvents(events, args, event, previousResult);
150150
}
151151
else {
152152
var observer = observers.shift(),
@@ -159,7 +159,7 @@ mixin(JSM.prototype, {
159159
return this.endTransit(false);
160160
}
161161
else {
162-
return this.observeEvents(events, args, event);
162+
return this.observeEvents(events, args, event, result);
163163
}
164164
}
165165
},

test/lifecycle.js

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,7 @@ test('lifecycle events can be deferred using a promise', t => {
490490

491491
var logger = new LifecycleLogger(),
492492
start = Date.now(),
493-
pause = function(ms) { return new Promise(function(resolve, reject) { setTimeout(resolve, ms); }); },
493+
pause = function(ms) { return new Promise(function(resolve, reject) { setTimeout(function() { resolve('resolved') }, ms); }); },
494494
fsm = new StateMachine({
495495
transitions: [
496496
{ name: 'step', from: 'none', to: 'complete' }
@@ -506,11 +506,11 @@ test('lifecycle events can be deferred using a promise', t => {
506506
onLeaveNone: function(lifecycle, a, b) { logger(lifecycle, a, b); return pause(100); },
507507
onLeaveComplete: function(lifecycle, a, b) { logger(lifecycle, a, b); return pause(100); },
508508
onAfterTransition: function(lifecycle, a, b) { logger(lifecycle, a, b); return pause(100); },
509-
onAfterStep: function(lifecycle, a, b) { logger(lifecycle, a, b); return done(); }
509+
onAfterStep: function(lifecycle, a, b) { logger(lifecycle, a, b); return pause(100); }
510510
}
511511
});
512512

513-
function done() {
513+
function done(answer) {
514514
var duration = Date.now() - start;
515515
t.is(fsm.state, 'complete')
516516
t.is(duration > 600, true)
@@ -525,10 +525,12 @@ test('lifecycle events can be deferred using a promise', t => {
525525
{ event: 'onAfterTransition', transition: 'step', from: 'none', to: 'complete', current: 'complete', args: [ 'additional', 'arguments' ] },
526526
{ event: 'onAfterStep', transition: 'step', from: 'none', to: 'complete', current: 'complete', args: [ 'additional', 'arguments' ] },
527527
])
528+
t.is(answer, 'resolved');
528529
resolveTest()
529530
}
530531

531532
fsm.step('additional', 'arguments')
533+
.then(done);
532534

533535
});
534536
});
@@ -542,15 +544,12 @@ test('lifecycle events can be cancelled using a promise', t => {
542544
start = Date.now(),
543545
pause = function(ms) {
544546
return new Promise(function(resolve, reject) {
545-
setTimeout(resolve, ms);
547+
setTimeout(function() { resolve('resolved') }, ms);
546548
});
547549
},
548550
cancel = function(ms) {
549551
return new Promise(function(resolve, reject) {
550-
setTimeout(function() {
551-
reject();
552-
done();
553-
}, ms);
552+
setTimeout(function() { reject('rejected'); }, ms);
554553
});
555554
},
556555
fsm = new StateMachine({
@@ -572,7 +571,7 @@ test('lifecycle events can be cancelled using a promise', t => {
572571
}
573572
});
574573

575-
function done() {
574+
function done(answer) {
576575
var duration = Date.now() - start;
577576
t.is(fsm.state, 'none');
578577
t.is(duration > 300, true);
@@ -583,10 +582,12 @@ test('lifecycle events can be cancelled using a promise', t => {
583582
{ event: 'onLeaveNone', transition: 'step', from: 'none', to: 'complete', current: 'none', args: [ 'additional', 'arguments' ] },
584583
{ event: 'onTransition', transition: 'step', from: 'none', to: 'complete', current: 'none', args: [ 'additional', 'arguments' ] }
585584
]);
585+
t.is(answer, 'rejected');
586586
resolveTest();
587587
}
588588

589589
fsm.step('additional', 'arguments')
590+
.then(done)
590591

591592
})
592593
})

0 commit comments

Comments
 (0)