$defer service should always call $eval after callback finished

Closes #189
This commit is contained in:
Igor Minar 2010-12-10 11:39:32 -08:00
parent 23fc73081f
commit b370fac4fc
3 changed files with 56 additions and 4 deletions

View file

@ -819,12 +819,16 @@ angularServiceInject('$xhr.bulk', function($xhr, $error, $log){
* @param {function()} fn A function, who's execution should be deferred. * @param {function()} fn A function, who's execution should be deferred.
*/ */
angularServiceInject('$defer', function($browser, $exceptionHandler) { angularServiceInject('$defer', function($browser, $exceptionHandler) {
var scope = this;
return function(fn) { return function(fn) {
$browser.defer(function() { $browser.defer(function() {
try { try {
fn(); fn();
} catch(e) { } catch(e) {
$exceptionHandler(e); $exceptionHandler(e);
} finally {
scope.$eval();
} }
}); });
}; };

View file

@ -361,12 +361,41 @@ describe("service", function(){
it('should delegate exception to the $exceptionHandler service', function() { it('should delegate exception to the $exceptionHandler service', function() {
$defer(function() { throw "Test Error"; }); $defer(function() {throw "Test Error";});
expect($exceptionHandler).not.toHaveBeenCalled(); expect($exceptionHandler).not.toHaveBeenCalled();
$browser.defer.flush(); $browser.defer.flush();
expect($exceptionHandler).toHaveBeenCalledWith("Test Error"); expect($exceptionHandler).toHaveBeenCalledWith("Test Error");
}); });
it('should call eval after each callback is executed', function() {
var eval = this.spyOn(scope, '$eval').andCallThrough();
$defer(function() {});
expect(eval).wasNotCalled();
$browser.defer.flush();
expect(eval).wasCalled();
eval.reset(); //reset the spy;
$defer(function() {});
$defer(function() {});
$browser.defer.flush();
expect(eval.callCount).toBe(2);
});
it('should call eval even if an exception is thrown in callback', function() {
var eval = this.spyOn(scope, '$eval').andCallThrough();
$defer(function() {throw "Test Error"});
expect(eval).wasNotCalled();
$browser.defer.flush();
expect(eval).wasCalled();
});
}); });
@ -543,6 +572,25 @@ describe("service", function(){
$browser.defer.flush(); $browser.defer.flush();
expect(log).toEqual('"+";"+";'); //callback has executed expect(log).toEqual('"+";"+";'); //callback has executed
}); });
it('should call eval after callbacks for both cache hit and cache miss execute', function() {
var eval = this.spyOn(scope, '$eval').andCallThrough();
$browserXhr.expectGET('/url').respond('+');
cache('GET', '/url', null, callback);
expect(eval).wasNotCalled();
$browserXhr.flush();
expect(eval).wasCalled();
eval.reset(); //reset the spy
cache('GET', '/url', null, callback);
expect(eval).wasNotCalled();
$browser.defer.flush();
expect(eval).wasCalled();
})
}); });
}); });

View file

@ -571,8 +571,8 @@ describe("widget", function(){
// this one should really be just '1', but due to lack of real events things are not working // this one should really be just '1', but due to lack of real events things are not working
// properly. see discussion at: http://is.gd/ighKk // properly. see discussion at: http://is.gd/ighKk
expect(element.text()).toEqual('2'); expect(element.text()).toEqual('4');
dealoc(scope); dealoc(element);
}); });
it('should evaluate onload expression when a partial is loaded', function() { it('should evaluate onload expression when a partial is loaded', function() {
@ -587,7 +587,7 @@ describe("widget", function(){
scope.$inject('$browser').defer.flush(); scope.$inject('$browser').defer.flush();
expect(element.text()).toEqual('my partial'); expect(element.text()).toEqual('my partial');
expect(scope.loaded).toBe(true); expect(scope.loaded).toBe(true);
dealoc(scope); dealoc(element);
}); });
}); });