diff --git a/src/injector.js b/src/injector.js index 9eac62a..714754a 100644 --- a/src/injector.js +++ b/src/injector.js @@ -218,12 +218,9 @@ class Injector { resolving.push(token); - // TODO(vojta): handle these cases: + // TODO(vojta): handle this case: // 1/ // - requested as promise (delayed) - // - requested again as promise (before the previous gets resolved) -> cache the promise - // 2/ - // - requested as promise (delayed) // - requested again sync (before the previous gets resolved) // -> error, but let it go inside to throw where exactly is the async provider var delayingInstantiation = wantPromise && provider.params.some((param) => !param.isPromise); @@ -243,7 +240,9 @@ class Injector { resolving.pop(); // Once all dependencies (promises) are resolved, instantiate. - return Promise.all(args).then(function(args) { + instance = Promise.all(args).then(function(args) { + injector._cache.delete(token); + try { instance = provider.create(args); } catch (e) { @@ -264,6 +263,8 @@ class Injector { // a promise or not. return instance; }); + this._cache.set(token, instance); + return instance; } try { diff --git a/test/async.spec.js b/test/async.spec.js index bcabce4..2abc758 100644 --- a/test/async.spec.js +++ b/test/async.spec.js @@ -97,6 +97,17 @@ describe('async', function() { expect(controller.promise).toBePromiseLike(); }); + it('should not instantiate multiple times in case of delayed instantiating', function(done) { + var injector = new Injector([fetchUsers]); + + Promise.all([ + injector.getPromise(UserController), + injector.getPromise(UserController) + ]).then(function(result) { + expect(result[0]).toBe(result[1]); + done(); + }); + }); // regression it('should not cache TransientScope', function(done) {