Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit ad90c35

Browse files
committed
feat($defer): add $defer.cancel
This functionality was previously available only as obscure $browser.defer.cancel. I also added docs and tests and fixed an issue in .defer.cancel mock.
1 parent e28171d commit ad90c35

File tree

4 files changed

+69
-4
lines changed

4 files changed

+69
-4
lines changed

src/Browser.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -390,12 +390,13 @@ function Browser(window, document, body, XHR, $log, $sniffer) {
390390
*
391391
* @name angular.service.$browser#defer.cancel
392392
* @methodOf angular.service.$browser.defer
393-
* @returns {boolean} Returns `true` if the task hasn't executed yet and was successfuly canceled.
394393
*
395394
* @description
396395
* Cancels a defered task identified with `deferId`.
396+
*
397+
* @param {*} deferId Token returned by the `$browser.defer` function.
398+
* @returns {boolean} Returns `true` if the task hasn't executed yet and was successfuly canceled.
397399
*/
398-
399400
self.defer.cancel = function(deferId) {
400401
if (pendingDeferIds[deferId]) {
401402
delete pendingDeferIds[deferId];

src/angular-mocks.js

+1
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,7 @@ function MockBrowser() {
283283

284284
if (fnIndex !== undefined) {
285285
self.deferredFns.splice(fnIndex, 1);
286+
return true;
286287
}
287288
};
288289

src/service/defer.js

+22-2
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,32 @@
1414
*
1515
* @param {function()} fn A function, who's execution should be deferred.
1616
* @param {number=} [delay=0] of milliseconds to defer the function execution.
17+
* @returns {*} DeferId that can be used to cancel the task via `$defer.cancel()`.
18+
*/
19+
20+
/**
21+
* @ngdoc function
22+
* @name angular.service.$defer#cancel
23+
* @methodOf angular.service.$defer
24+
*
25+
* @description
26+
* Cancels a defered task identified with `deferId`.
27+
*
28+
* @param {*} deferId Token returned by the `$defer` function.
29+
* @returns {boolean} Returns `true` if the task hasn't executed yet and was successfuly canceled.
1730
*/
1831
angularServiceInject('$defer', function($browser) {
1932
var scope = this;
20-
return function(fn, delay) {
21-
$browser.defer(function() {
33+
34+
function defer(fn, delay) {
35+
return $browser.defer(function() {
2236
scope.$apply(fn);
2337
}, delay);
38+
}
39+
40+
defer.cancel = function(deferId) {
41+
return $browser.defer.cancel(deferId);
2442
};
43+
44+
return defer;
2545
}, ['$browser']);

test/service/deferSpec.js

+43
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,53 @@ describe('$defer', function() {
6969
expect(applySpy).toHaveBeenCalled();
7070
});
7171

72+
7273
it('should allow you to specify the delay time', function() {
7374
var defer = this.spyOn($browser, 'defer');
7475
$defer(noop, 123);
7576
expect(defer.callCount).toEqual(1);
7677
expect(defer.mostRecentCall.args[1]).toEqual(123);
7778
});
79+
80+
81+
it('should return a cancelation token', function() {
82+
var defer = this.spyOn($browser, 'defer').andReturn('xxx');
83+
expect($defer(noop)).toEqual('xxx');
84+
});
85+
86+
87+
describe('cancel', function() {
88+
it('should cancel tasks', function() {
89+
var task1 = jasmine.createSpy('task1'),
90+
task2 = jasmine.createSpy('task2'),
91+
task3 = jasmine.createSpy('task3'),
92+
token1, token3;
93+
94+
token1 = $defer(task1);
95+
$defer(task2);
96+
token3 = $defer(task3, 333);
97+
98+
$defer.cancel(token3);
99+
$defer.cancel(token1);
100+
$browser.defer.flush();
101+
102+
expect(task1).not.toHaveBeenCalled();
103+
expect(task2).toHaveBeenCalledOnce();
104+
expect(task3).not.toHaveBeenCalled();
105+
});
106+
107+
108+
it('should return true if a task was succesffuly canceled', function() {
109+
var task1 = jasmine.createSpy('task1'),
110+
task2 = jasmine.createSpy('task2'),
111+
token1, token2;
112+
113+
token1 = $defer(task1);
114+
$browser.defer.flush();
115+
token2 = $defer(task2);
116+
117+
expect($defer.cancel(token1)).toBeFalsy();
118+
expect($defer.cancel(token2)).toBe(true);
119+
});
120+
});
78121
});

0 commit comments

Comments
 (0)