From a089265696184aed46eeda3a4450c264b3b179e6 Mon Sep 17 00:00:00 2001 From: Magnus Wolffelt Date: Fri, 26 Sep 2014 20:09:37 +0200 Subject: [PATCH] Refactored Promise implementaion with more features and robustness --- src/api/promise.js | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/src/api/promise.js b/src/api/promise.js index 7439af3..a36de49 100644 --- a/src/api/promise.js +++ b/src/api/promise.js @@ -1,13 +1,27 @@ - -// A generic promiese interface by using riot.observable - -function Promise(fn) { - var self = riot.observable(this); - - $.map(['done', 'fail', 'always'], function(name) { - self[name] = function(arg) { - return self[$.isFunction(arg) ? 'on' : 'trigger'](name, arg); - }; - }); - -} +// Simple Promise pattern using riot.observable +function Promise() { + var self = riot.observable(this); + self.resolution = null; + self.result = null; + $.map(['done', 'fail', 'always'], function(name) { + self[name] = function(arg) { + if($.isFunction(arg)) { + self.one(name, arg); + if(self.resolution === name || (self.resolution !== null && name === 'always')) { + self.trigger(name, self.result); + } + } else { + if(name === 'always') { + throw new Error('Invalid argument for "always" function: ' + arg); + } + if(self.resolution !== null) { + throw new Error('Can not resolve promise - already resolved to ' + self.resolution) + } + self.resolution = name; + self.result = arg; + self.trigger(name, self.result).trigger('always', self.result); + } + return self; + }; + }); +} \ No newline at end of file