mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-05-09 15:24:43 +00:00
$defer service should always call $eval after callback finished
Closes #189
This commit is contained in:
parent
23fc73081f
commit
b370fac4fc
3 changed files with 56 additions and 4 deletions
|
|
@ -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();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue